/ Hex Artifact Content
Login

Artifact 5047fb303cdf6806a42676a6f513c57e15b7d69b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28   }.  pPtrmap = (
65f0: 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  u8 *)sqlite3Page
6600: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
6610: 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21  );..  if( eType!
6620: 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d  =pPtrmap[offset]
6630: 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50   || get4byte(&pP
6640: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6650: 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20  !=parent ){.    
6660: 54 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55  TRACE(("PTRMAP_U
6670: 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25  PDATE: %d->(%d,%
6680: 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70  d)\n", key, eTyp
6690: 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20  e, parent));.   
66a0: 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69   *pRC= rc = sqli
66b0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
66c0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
66d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
66e0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
66f0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
6700: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
6710: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
6720: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
6730: 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78  }.  }..ptrmap_ex
6740: 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  it:.  sqlite3Pag
6750: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
6770: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
6780: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6790: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
67a0: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
67c0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
67d0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
67e0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
67f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
6800: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
6810: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
6820: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
6830: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
6840: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
6850: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
6860: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6870: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
6880: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
6890: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
68a0: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
68b0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
68c0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
68d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
68e0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
68f0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6900: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6910: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
6920: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
6930: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
6940: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
6950: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
6960: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
6970: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
6980: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
6990: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
69a0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
69b0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
69c0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
69d0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
69e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
69f0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
6a00: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
6a10: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
6a20: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
6a30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
6a40: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
6a50: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
6a60: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
6a70: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6a80: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6a90: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
6aa0: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
6ab0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
6ac0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
6ad0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
6ae0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
6af0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
6b00: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6b10: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b20: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6b30: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6b40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6b50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6b60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6b70: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6b80: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6b90: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6ba0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
6bb0: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
6bc0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6bd0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6be0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6bf0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6c00: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
6c10: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
6c20: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
6c30: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
6c40: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
6c50: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
6c60: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
6c70: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6c80: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6c90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6ca0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6cb0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6cc0: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6cd0: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6ce0: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6cf0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6d00: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6d10: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
6d20: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
6d30: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
6d40: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
6d50: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
6d60: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
6d70: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6d80: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6d90: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6da0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6db0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6dc0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6dd0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6de0: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6df0: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6e00: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6e10: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
6e20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6e30: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6e40: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
6e50: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
6e60: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
6e70: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6e80: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6e90: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6ea0: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6eb0: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6ec0: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6ed0: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6ee0: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6ef0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6f00: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6f10: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
6f20: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
6f30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
6f40: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
6f50: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
6f60: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
6f70: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6f80: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6f90: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6fa0: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6fb0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6fc0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72  s function.  btr
6fd0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
6fe0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6ff0: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
7000: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
7010: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7020: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
7030: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
7040: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
7050: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
7060: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
7070: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
7080: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
7090: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
70a0: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
70b0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
70c0: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
70d0: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
70e0: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
70f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7100: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7110: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
7120: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7130: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7140: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
7150: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
7160: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
7170: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
7180: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
7190: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
71a0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
71b0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
71c0: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
71d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
71e0: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
71f0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
7200: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
7210: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
7220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7230: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
7240: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
7250: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7260: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
7270: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
7280: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
7290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
72a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
72b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
72c0: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
72d0: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
72e0: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
72f0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
7300: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7310: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
7320: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7330: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7340: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
7350: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
7360: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
7370: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
7380: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
7390: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
73a0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
73b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
73c0: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
73d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
73e0: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
73f0: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7400: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7410: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
7420: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
7430: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
7440: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
7450: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
7460: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65  Header = n;.  te
7470: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
7480: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
7490: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
74a0: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
74b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
74c0: 20 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61    if( likely(nPa
74d0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
74e0: 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f  xLocal) ){.    /
74f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
7500: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
7510: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
7520: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
7530: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
7540: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
7550: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
7560: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
7570: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
7580: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
7590: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
75a0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
75b0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
75c0: 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   + n;.    pInfo-
75d0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
75e0: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
75f0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7600: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
7610: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
7620: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
7630: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
7640: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
7650: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
7660: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
7670: 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  )nSize;.  }else{
7680: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
7690: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
76a0: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
76b0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
76c0: 2c 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a  , we have.    **
76d0: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
76e0: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
76f0: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
7700: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
7710: 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
7720: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
7730: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
7740: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
7750: 66 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20  f unused.    ** 
7760: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
7770: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
7780: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
7790: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
77a0: 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77  e.    ** in betw
77b0: 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64  een minLocal and
77c0: 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a   maxLocal..    *
77d0: 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67  *.    ** Warning
77e0: 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  :  changing the 
77f0: 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79  way overflow pay
7800: 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75  load is distribu
7810: 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a  ted in any.    *
7820: 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c  * way will resul
7830: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  t in an incompat
7840: 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74  ible file format
7850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
7860: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
7870: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
7880: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
7890: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78a0: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
78b0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
78c0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
78d0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74  cally */.    int
78e0: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
78f0: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
7900: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
7910: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
7920: 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70      minLocal = p
7930: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7940: 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70      maxLocal = p
7950: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  Page->maxLocal;.
7960: 20 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69      surplus = mi
7970: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f  nLocal + (nPaylo
7980: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
7990: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
79a0: 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
79b0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
79c0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
79d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75      testcase( su
79e0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
79f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72  1 );.    if( sur
7a00: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
7a10: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
7a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73  >nLocal = (u16)s
7a30: 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73  urplus;.    }els
7a40: 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  e{.      pInfo->
7a50: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69  nLocal = (u16)mi
7a60: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  nLocal;.    }.  
7a70: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
7a80: 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f  ow = (u16)(pInfo
7a90: 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20  ->nLocal + n);. 
7aa0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
7ab0: 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c  = pInfo->iOverfl
7ac0: 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64  ow + 4;.  }.}.#d
7ad0: 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28  efine parseCell(
7ae0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
7af0: 6e 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61  nfo) \.  btreePa
7b00: 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67  rseCellPtr((pPag
7b10: 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50  e), findCell((pP
7b20: 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20  age), (iCell)), 
7b30: 28 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20  (pInfo)).static 
7b40: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7b50: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
7b60: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
7b70: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
7b80: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
7b90: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
7ba0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7bb0: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
7bc0: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
7bd0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
7be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7bf0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7c00: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65  re */.){.  parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a  l, pInfo);.}../*
7c30: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
7c40: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
7c50: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
7c60: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
7c70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
7c80: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
7c90: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
7ca0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
7cb0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7cc0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
7cd0: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
7ce0: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
7cf0: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
7d00: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
7d10: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
7d20: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  r..*/.static u16
7d30: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
7d40: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7d50: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
7d60: 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50  Iter = &pCell[pP
7d70: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7d80: 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b  e];.  u32 nSize;
7d90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7da0: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
7db0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
7dc0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
7dd0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
7de0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
7df0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
7e00: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
7e10: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
7e20: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
7e30: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
7e40: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
7e50: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
7e60: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
7e70: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
7e80: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
7e90: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
7ea0: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
7eb0: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
7ec0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
7ed0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7ee0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7ef0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7f00: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
7f10: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
7f20: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
7f30: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7f40: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
7f50: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
7f60: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7f80: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7f90: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7fa0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7fb0: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7fc0: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7fd0: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7fe0: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7ff0: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
8000: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
8010: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
8020: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
8030: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
8040: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
8050: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
8060: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
8070: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
8080: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
8090: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
80a0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
80b0: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
80c0: 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61  );.  }..  testca
80d0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
80e0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
80f0: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8100: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8110: 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a  +1 );.  if( nSiz
8120: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8130: 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  l ){.    int min
8140: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8150: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
8160: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
8170: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
8180: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
8190: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
81a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
81b0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81c0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
81d0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
81e0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
81f0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
8200: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
8210: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
8220: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
8230: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
8240: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
8250: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
8260: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
8270: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
8280: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
8290: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
82a0: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
82b0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
82c0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
82d0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
82e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
82f0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
8300: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8310: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
8320: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
8330: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
8340: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
8350: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
8360: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
8370: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
8380: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
8390: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
83a0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
83b0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
83c0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
83d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
83e0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
83f0: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
8400: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
8410: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
8420: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
8430: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
8440: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
8450: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
8460: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
8470: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
8480: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
8490: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
84a0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
84b0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
84c0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
84d0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
84e0: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
84f0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8500: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
8510: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
8520: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
8530: 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  fo);.  assert( (
8540: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
8550: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
8560: 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
8570: 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20  ayload );.  if( 
8580: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
8590: 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20  {.    Pgno ovfl 
85a0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
85b0: 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
85c0: 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
85d0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
85e0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
85f0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
8600: 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23  o, pRC);.  }.}.#
8610: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  endif.../*.** De
8620: 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67  fragment the pag
8630: 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65  e given.  All Ce
8640: 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f  lls are moved to
8650: 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74   the.** end of t
8660: 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  he page and all 
8670: 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f  free space is co
8680: 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65  llected into one
8690: 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20  .** big FreeBlk 
86a0: 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62  that occurs in b
86b0: 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65  etween the heade
86c0: 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f  r and cell.** po
86d0: 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20  inter array and 
86e0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
86f0: 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   area..*/.static
8700: 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50   int defragmentP
8710: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8720: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8750: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
8780: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
8790: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
87b0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
87c0: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
87d0: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
87f0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
8800: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8820: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
8830: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
8840: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
8850: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
8860: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8870: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
8880: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
8890: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
88a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
88b0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
88c0: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
88d0: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
88e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
88f0: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
8900: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
8910: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
8920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8930: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
8940: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
8950: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
8960: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
8970: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ent */.  int iCe
8980: 6c 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  llFirst;        
8990: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
89a0: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  owable cell inde
89b0: 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  x */.  int iCell
89c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
89d0: 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62    /* Last possib
89e0: 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f  le cell index */
89f0: 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ...  assert( sql
8a00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
8a10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
8a20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8a30: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
8a40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8a50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8a60: 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41  ize <= SQLITE_MA
8a70: 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20  X_PAGE_SIZE );. 
8a80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8a90: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ab0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8ac0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8ad0: 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69  );.  temp = sqli
8ae0: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
8af0: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
8b00: 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20  ager);.  data = 
8b10: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
8b20: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
8b30: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
8b40: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
8b50: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
8b60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
8b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
8b80: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
8b90: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75  a[hdr+3]) );.  u
8ba0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
8bb0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bc0: 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74  ze;.  cbrk = get
8bd0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8be0: 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74  5]);.  memcpy(&t
8bf0: 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  emp[cbrk], &data
8c00: 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  [cbrk], usableSi
8c10: 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62  ze - cbrk);.  cb
8c20: 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  rk = usableSize;
8c30: 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20  .  iCellFirst = 
8c40: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e  cellOffset + 2*n
8c50: 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73  Cell;.  iCellLas
8c60: 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d  t = usableSize -
8c70: 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   4;.  for(i=0; i
8c80: 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
8c90: 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20    u8 *pAddr;    
8ca0: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c   /* The i-th cel
8cb0: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
8cc0: 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63   pAddr = &data[c
8cd0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d  ellOffset + i*2]
8ce0: 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  ;.    pc = get2b
8cf0: 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20  yte(pAddr);.    
8d00: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d10: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
8d20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
8d30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21  ellLast );.#if !
8d40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8d50: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8d60: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f  ELL_CHECK).    /
8d70: 2a 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f  * These conditio
8d80: 6e 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ns have already 
8d90: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e  been verified in
8da0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
8db0: 0a 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54  .    ** if SQLIT
8dc0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8dd0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20  E_CELL_CHECK is 
8de0: 64 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a  defined .    */.
8df0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
8e00: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
8e10: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
8e20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8e30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8e40: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8e50: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
8e60: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
8e70: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
8e80: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
8e90: 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b  age, &temp[pc]);
8ea0: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
8eb0: 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e;.#if defined(S
8ec0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8ed0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8ee0: 29 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ).    if( cbrk<i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20  CellFirst ){.   
8f00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8f10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8f20: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
8f30: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
8f40: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
8f50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
8f60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8f70: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61    }.#endif.    a
8f90: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
8fa0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
8fb0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
8fc0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8fd0: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
8fe0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
8ff0: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
9000: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9010: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
9020: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
9030: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
9040: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
9050: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
9060: 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  t( cbrk>=iCellFi
9070: 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74  rst );.  put2byt
9080: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
9090: 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64  cbrk);.  data[hd
90a0: 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+1] = 0;.  data
90b0: 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+2] = 0;.  d
90c0: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
90d0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
90e0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
90f0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
9100: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9110: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9120: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9130: 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b  e) );.  if( cbrk
9140: 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61  -iCellFirst!=pPa
9150: 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
9160: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9170: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
9180: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9190: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
91a0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
91b0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
91c0: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
91d0: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
91e0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
91f0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
9200: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
9210: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
9220: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
9230: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
9240: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
9250: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
9260: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
9270: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
9280: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
9290: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
92a0: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
92b0: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
92c0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
92d0: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
92e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
92f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
9300: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
9310: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
9320: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
9330: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
9340: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
9350: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
9360: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
9370: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
9380: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
9390: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
93a0: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
93b0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
93c0: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
93d0: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
93e0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
93f0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
9400: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
9410: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
9420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9430: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
9440: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
9450: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
9460: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
9470: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
9480: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
9490: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
94a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
94b0: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
94c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
94d0: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
94e0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
94f0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
9500: 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20   nFrag;         
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
9530: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9540: 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  on pPage */.  in
9550: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9580: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
9590: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67   area */.  int g
95a0: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
95b0: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
95c0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
95d0: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
95e0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
95f0: 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  rc;         /* I
9600: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
9610: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  de */.  int usab
9620: 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
9630: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61  e size of the pa
9640: 67 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ge */.  .  asser
9650: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
9660: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
9670: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9680: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9690: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
96a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
96b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
96c0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
96d0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
96e0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
96f0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
9700: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
9710: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
9720: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9730: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
9740: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
9750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9760: 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
9770: 6e 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69  nByte < usableSi
9780: 7a 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67  ze-8 );..  nFrag
9790: 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a   = data[hdr+7];.
97a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
97b0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
97c0: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
97d0: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
97e0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
97f0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
9800: 6e 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67  nCell;.  top = g
9810: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9820: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9830: 69 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65  if( gap>top ) re
9840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74  UPT_BKPT;.  test
9860: 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70  case( gap+2==top
9870: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9880: 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+1==top );.  
9890: 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74  testcase( gap==t
98a0: 6f 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72  op );..  if( nFr
98b0: 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a  ag>=60 ){.    /*
98c0: 20 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65   Always defragme
98d0: 6e 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65  nt highly fragme
98e0: 6e 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20  nted pages */.  
98f0: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
9900: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
9910: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
9920: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
9930: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
9940: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9950: 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32   }else if( gap+2
9960: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  <=top ){.    /* 
9970: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c  Search the freel
9980: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
9990: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
99a0: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
99b0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65  y .    ** the re
99c0: 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63  quest. The alloc
99d0: 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72  ation is made fr
99e0: 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65  om the first fre
99f0: 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a  e slot in .    *
9a00: 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  * the list that 
9a10: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
9a20: 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74  to accomadate it
9a30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
9a40: 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66   pc, addr;.    f
9a50: 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28  or(addr=hdr+1; (
9a60: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
9a70: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61  ata[addr]))>0; a
9a80: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69  ddr=pc){.      i
9a90: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9aa0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
9ab0: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
9ac0: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
9ad0: 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c  bleSize-4 || pc<
9ae0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65      }.      size
9b20: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9b30: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
9b40: 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20  if( size>=nByte 
9b50: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
9b60: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   = size - nByte;
9b70: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9b80: 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20  e( x==4 );.     
9b90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
9ba0: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  3 );.        if(
9bb0: 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20   x<4 ){.        
9bc0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
9bd0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
9be0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
9bf0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
9c00: 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d          ** fragm
9c10: 65 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68  ented bytes with
9c20: 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  in the page. */.
9c30: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
9c40: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
9c50: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
9c60: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
9c70: 37 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20  7] = (u8)(nFrag 
9c80: 2b 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  + x);.        }e
9c90: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
9ca0: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
9cb0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9cc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9cd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
9ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
9cf0: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
9d00: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
9d10: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
9d20: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
9d30: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
9d40: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
9d50: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
9d60: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
9d70: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
9d80: 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a  data[pc+2], x);.
9d90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9da0: 20 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78    *pIdx = pc + x
9db0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9dc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
9dd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
9de0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
9df0: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
9e00: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20  enough space in 
9e10: 74 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73  the gap to satis
9e20: 66 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f  fy.  ** the allo
9e30: 63 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c  cation.  If not,
9e40: 20 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a   defragment..  *
9e50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
9e60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
9e70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
9e80: 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72  yte>top ){.    r
9e90: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9ea0: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9eb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9ec0: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9ed0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9ee0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
9ef0: 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74  assert( gap+nByt
9f00: 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a  e<=top );.  }...
9f10: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
9f20: 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61  mory from the ga
9f30: 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  p in between the
9f40: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9f50: 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ray.  ** and the
9f60: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9f70: 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e  ea.  The btreeIn
9f80: 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61  itPage() call ha
9f90: 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76  s already.  ** v
9fa0: 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65  alidated the fre
9fb0: 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68  elist.  Given th
9fc0: 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  at the freelist 
9fd0: 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a  is valid, there.
9fe0: 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74    ** is no way t
9ff0: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
a000: 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66  on can extend of
a010: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a020: 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20   page..  ** The 
a030: 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76  assert() below v
a040: 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76  erifies the prev
a050: 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20  ious sentence.. 
a060: 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79   */.  top -= nBy
a070: 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  te;.  put2byte(&
a080: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
a090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70  );.  assert( top
a0a0: 2b 6e 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d  +nByte <= pPage-
a0b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a0c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
a0d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
a0e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
a0f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
a100: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
a110: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
a120: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
a130: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
a140: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
a150: 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74   pPage->aDisk[st
a160: 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20  art].** and the 
a170: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63  size of the bloc
a180: 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74 65  k is "size" byte
a190: 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  s..**.** Most of
a1a0: 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72 65   the effort here
a1b0: 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
a1c0: 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65  coalesing adjace
a1d0: 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b  nt.** free block
a1e0: 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
a1f0: 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a  big free block..
a200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
a210: 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  eeSpace(MemPage 
a220: 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72  *pPage, int star
a230: 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20  t, int size){.  
a240: 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e  int addr, pbegin
a250: 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61  , hdr;.  int iLa
a260: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
a270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
a280: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
a290: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
a2a0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
a2b0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
a2c0: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
a2d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
a2e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
a2f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a300: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a310: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a320: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
a330: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50  ->hdrOffset+6+pP
a340: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a350: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  e );.  assert( (
a360: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
a370: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a380: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
a390: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
a3a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
a3b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
a3c0: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
a3d0: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
a3e0: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
a3f0: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42  .  if( pPage->pB
a400: 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
a410: 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  ){.    /* Overwr
a420: 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
a430: 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
a440: 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 75  os when the secu
a450: 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a  re_delete.    **
a460: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
a470: 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
a480: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
a490: 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  , size);.  }..  
a4a0: 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65  /* Add the space
a4b0: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c   back into the l
a4c0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72  inked list of fr
a4d0: 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20  eeblocks.  Note 
a4e0: 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74  that.  ** even t
a4f0: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
a500: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
a510: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
a520: 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74  tPage(),.  ** bt
a530: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64 69  reeInitPage() di
a540: 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  d not detect ove
a550: 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f  rlapping cells o
a560: 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b  r.  ** freeblock
a570: 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65  s that overlappe
a580: 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64  d cells.   Nor d
a590: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77 68  oes it detect wh
a5a0: 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  en the.  ** cell
a5b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78   content area ex
a5c0: 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65 20  ceeds the value 
a5d0: 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64  in the page head
a5e0: 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20  er.  If these.  
a5f0: 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72  ** situations ar
a600: 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ise, then subseq
a610: 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72  uent insert oper
a620: 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72  ations might cor
a630: 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72  rupt.  ** the fr
a640: 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64  eelist.  So we d
a650: 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  o need to check 
a660: 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  for corruption w
a670: 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20  hile scanning.  
a680: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a690: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
a6a0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
a6b0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
a6c0: 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67  ;.  iLast = pPag
a6d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a6e0: 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74  ze - 4;.  assert
a6f0: 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29  ( start<=iLast )
a700: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
a710: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
a720: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
a730: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
a740: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c  .    if( pbegin<
a750: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
a760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a770: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a780: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
a790: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
a7a0: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
a7b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a7c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a7d0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
a7e0: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
a7f0: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
a800: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
a810: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
a820: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
a830: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
a840: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
a850: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
a860: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
a870: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
a880: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
a890: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
a8a0: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
a8b0: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
a8c0: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
a8d0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
a8e0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
a8f0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
a900: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
a910: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
a920: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a930: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
a940: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a950: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a960: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a970: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a980: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a990: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a9a0: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a9b0: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a9c0: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a9d0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a9e0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a9f0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa00: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa10: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa20: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aa30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aa40: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aa50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aa60: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aa70: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aa80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
aa90: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
aaa0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
aab0: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
aac0: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
aae0: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
aaf0: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab00: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab10: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab20: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
ab30: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
ab40: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
ab50: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
ab60: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
ab70: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
ab80: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ab90: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
aba0: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
abb0: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
abc0: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
abd0: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
abe0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
abf0: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac10: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
ac30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ac40: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
ac50: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
ac60: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac70: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
ac80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ac90: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
aca0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
acb0: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
acc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
acd0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ace0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
acf0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad00: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad10: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad20: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ad30: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
ad40: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
ad50: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
ad60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ad70: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
ad80: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ad90: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ada0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
adb0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
adc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
add0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ade0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
adf0: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae00: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae10: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae20: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
ae30: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
ae40: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
ae50: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
ae60: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
ae70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ae80: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
ae90: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
aea0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
aeb0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
aed0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
aee0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
aef0: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af10: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
af30: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
af40: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
af50: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
af60: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
af70: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
af80: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
af90: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
afa0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
afb0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
afc0: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
afd0: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
afe0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
aff0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b000: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b010: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b020: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b030: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b040: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b050: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b060: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b070: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b080: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b090: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b0a0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b0b0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b0c0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b0d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b0e0: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b0f0: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b100: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b110: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b130: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b140: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b150: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b160: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b170: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b180: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b190: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b1a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b1b0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b1c0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b1d0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b1e0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b1f0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b200: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b210: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b220: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b230: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b240: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b250: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b260: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b270: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b280: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b290: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b2a0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b2c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b2d0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b2e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b2f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b300: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b310: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b320: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b330: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b340: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b350: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b360: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b370: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b390: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b3b0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b3c0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b3d0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b3e0: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b3f0: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b400: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b420: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b430: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b440: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b450: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b460: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b470: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b480: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b490: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b4a0: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b4b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b4c0: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b4d0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b4e0: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b4f0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b500: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b510: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b520: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b530: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b540: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b550: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b560: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b570: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b580: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b590: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b5a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b5b0: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b5c0: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b5d0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b5e0: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b5f0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b600: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b610: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b620: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b630: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b640: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b650: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b660: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b670: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b680: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b690: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b6a0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b6b0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b6c0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b6d0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b6e0: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b6f0: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b700: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b710: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b720: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b730: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b740: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b750: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b760: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b770: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b780: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b790: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b7a0: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b7b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b7c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b7d0: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b7e0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b7f0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b800: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b810: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b820: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b830: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b840: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b850: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b860: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b870: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b880: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b890: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b8a0: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b8b0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b8c0: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b8e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b8f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b900: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b910: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b920: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b930: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b940: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b950: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b960: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b970: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b980: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
b990: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
b9a0: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
b9b0: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
b9c0: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
b9d0: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
b9e0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
b9f0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba00: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba10: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba20: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
ba30: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
ba40: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
ba50: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
ba60: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
ba70: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
ba80: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
ba90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
baa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bab0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bac0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bad0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bae0: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
baf0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb00: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb10: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb20: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bb30: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bb40: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bb50: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bb60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bb70: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bb80: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bb90: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bba0: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bbb0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bbc0: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bbd0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bbe0: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bbf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc00: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc10: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc20: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bc30: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bc40: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bc50: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bc60: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bc70: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bc80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc90: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bcb0: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bcc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bcd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bce0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bcf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd00: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd10: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd20: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bd30: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bd40: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bd50: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bd60: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bd70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bd80: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
bd90: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
bda0: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
bdb0: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
bdc0: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
bdd0: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bde0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bdf0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be00: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be10: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be20: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
be30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
be50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
be60: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
be70: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
be80: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
be90: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bea0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
beb0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bec0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bed0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bee0: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bef0: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf00: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf10: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf20: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bf30: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bf40: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bf50: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bf60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bf70: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bf80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
bf90: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
bfa0: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
bfb0: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
bfc0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
bfd0: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
bfe0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
bff0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c000: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c010: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c020: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c030: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c040: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c050: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c060: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c070: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c080: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c090: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c0a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c0b0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c0c0: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c0d0: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c0e0: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c0f0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c100: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c110: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c120: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c130: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c140: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c150: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c160: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c170: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c180: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c190: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c1a0: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c1b0: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c1c0: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c1d0: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c1e0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c1f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c200: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c210: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c220: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c230: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c240: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c250: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c260: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c270: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c280: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c290: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c2a0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c2b0: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c2c0: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c2d0: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c2e0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c2f0: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c310: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c320: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c330: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c350: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c360: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c370: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c380: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c390: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c3a0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c3b0: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c3c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c3d0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c3e0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c410: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c420: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c430: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c440: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c450: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c460: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c470: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c480: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c490: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c4a0: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c4b0: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c4c0: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c4d0: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c4e0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c4f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c500: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c510: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c520: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c530: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c540: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c550: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c560: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c570: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c580: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c590: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c5a0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c5b0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c5c0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c5d0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c5e0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c5f0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c600: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c610: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c620: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c630: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c640: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c650: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c660: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c670: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c680: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c690: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c6a0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c6b0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c6c0: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c6d0: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c6e0: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c6f0: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c700: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c710: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c720: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c730: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c740: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c750: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c760: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c770: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c780: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c790: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c7a0: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c7b0: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c7c0: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c7d0: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c7e0: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c7f0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c800: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c810: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c820: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c830: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c840: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c850: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c860: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c870: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c880: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c890: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c8a0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c8b0: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c8c0: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c8d0: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c8e0: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c8f0: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c900: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c910: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c920: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c930: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c940: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c950: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c960: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c970: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c980: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
c990: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
c9a0: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
c9b0: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
c9c0: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
c9d0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
c9e0: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
c9f0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca00: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca10: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ca30: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
ca40: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
ca50: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
ca60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
ca70: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
ca80: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
ca90: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
caa0: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cab0: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cac0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cad0: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cae0: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
caf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb00: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb20: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cb30: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cb40: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cb50: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cb60: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cb70: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cb80: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cb90: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cba0: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cbb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cbc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cbd0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cbe0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc00: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc10: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc20: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cc30: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
cc40: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
cc50: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cc60: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cc70: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
cc80: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cc90: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cca0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
ccb0: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
ccc0: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
ccd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
ccf0: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd10: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd20: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cd30: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cd40: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cd50: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cd60: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cd70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cd80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cd90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
cda0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
cdb0: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
cdc0: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
cdd0: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
cde0: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
cdf0: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce00: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce10: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce20: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
ce30: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ce40: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
ce50: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ce60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
ce70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
ce80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
ce90: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cea0: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
ceb0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cec0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
ced0: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cee0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cef0: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf00: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf20: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cf30: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cf40: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cf50: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cf60: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cf70: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cf80: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
cf90: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
cfa0: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
cfb0: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
cfc0: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
cfd0: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
cfe0: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
cff0: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d000: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d010: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d020: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d030: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d040: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d050: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d060: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d070: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d080: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d090: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d0a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d0b0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d0c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d0d0: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d0f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d100: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d110: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d120: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d130: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d150: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d160: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d170: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d190: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d1a0: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d1b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d1c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d1d0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d1e0: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d1f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d200: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d210: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d220: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d230: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d240: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d250: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d260: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d270: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d280: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d290: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d2a0: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d2b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d2c0: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d2d0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d2e0: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d2f0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d300: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d310: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d320: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d330: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d340: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d350: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d360: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d370: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d380: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d390: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d3a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d3b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d3c0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d3d0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d3e0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d3f0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d400: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d410: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d420: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d430: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d440: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d450: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d460: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d470: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d480: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d490: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d4a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d4b0: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d4c0: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d4d0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d4e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d4f0: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d500: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d510: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d520: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d530: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d540: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d560: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d570: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d580: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d590: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d5a0: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d5b0: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d5c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d5d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d5e0: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d5f0: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d600: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d610: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d620: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d630: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d640: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d650: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d660: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d670: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d680: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d690: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d6a0: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d6b0: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d6c0: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d6d0: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d6e0: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d6f0: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d700: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d710: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d720: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d730: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d740: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d750: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d760: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d770: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d780: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d790: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d7a0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d7b0: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d7c0: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d7d0: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d7e0: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d7f0: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d800: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d810: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d820: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d830: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d840: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d850: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d860: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d870: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d880: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d890: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d8a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d8b0: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d8c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d8d0: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d8f0: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d900: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d910: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d920: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d930: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d950: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d960: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d970: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d990: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
d9a0: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65   is NULL.** a ne
d9b0: 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  w database with 
d9c0: 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73  a random name is
d9d0: 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73 20   created.  This 
d9e0: 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a  randomly named.*
d9f0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
da00: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20  will be deleted 
da10: 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
da20: 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
da30: 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  ed..** If zFilen
da40: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
da50: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
da60: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
da70: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
da80: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
da90: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
daa0: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
dab0: 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
dac0: 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
dad0: 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
dae0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
daf0: 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
db00: 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
db10: 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
db20: 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
db30: 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
db40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
db50: 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
db60: 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
db70: 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
db80: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
db90: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
dba0: 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
dbb0: 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
dbc0: 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
dbd0: 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
dbe0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
dbf0: 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  Open(.  const ch
dc00: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
dc10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
dc20: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
dc30: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
dc40: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
dc50: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
dc60: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
dc70: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
dc80: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
dc90: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
dca0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
dcb0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
dcc0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
dcd0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
dce0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
dcf0: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
dd00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
dd10: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
dd20: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
dd30: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
dd40: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
dd50: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
dd60: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75   /* The VFS to u
dd70: 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65  se for this btre
dd80: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
dd90: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20  *pBt = 0;       
dda0: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
ddb0: 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74  part of btree st
ddc0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72  ructure */.  Btr
ddd0: 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ee *p;          
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
ddf0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20  andle to return 
de00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
de10: 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20  ex *mutexOpen = 
de20: 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20  0;  /* Prevents 
de30: 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
de40: 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a  . Ticket #3537 *
de50: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
de60: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
de70: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
de80: 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  e from this func
de90: 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65  tion */.  u8 nRe
dea0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
deb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
dec0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
ded0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
dee0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
def0: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
df00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65    /* Database he
df10: 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  ader content */.
df20: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
df30: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
df40: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
df50: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
df60: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
df70: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
df80: 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  d database. This
df90: 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20   symbol is only 
dfa0: 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a  required if.  **
dfb0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 73   either of the s
dfc0: 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75  hared-data or au
dfd0: 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72 65  tovacuum feature
dfe0: 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a  s are compiled .
dff0: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69    ** into the li
e000: 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  brary..  */.#if 
e010: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e020: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e030: 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  E) || !defined(S
e040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
e050: 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20  ACUUM).  #ifdef 
e060: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e070: 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69  RYDB.    const i
e080: 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
e090: 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73    #else.    cons
e0a0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e0b0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74  zFilename && !st
e0c0: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
e0d0: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23  ":memory:");.  #
e0e0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
e0f0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
e100: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e110: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
e120: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
e130: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
e140: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
e150: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
e160: 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70  tree));.  if( !p
e170: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e190: 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
e1a0: 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
e1b0: 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
e1c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
e1d0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
e1e0: 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
e1f0: 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
e200: 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
e210: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e220: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
e230: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
e240: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
e250: 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
e260: 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
e270: 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
e280: 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
e290: 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
e2a0: 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
e2b0: 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
e2c0: 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
e2d0: 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
e2e0: 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c  Memdb==0 && zFil
e2f0: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
e300: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28  me[0] ){.    if(
e310: 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
e320: 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
e330: 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
e340: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
e350: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
e360: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
e370: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
e380: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
e390: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e3b0: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
e3c0: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
e3d0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  le = 1;.      if
e3e0: 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ( !zFullPathname
e3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e400: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
e410: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e420: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
e430: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  }.      sqlite3O
e440: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
e450: 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
e460: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46  FullPathname, zF
e470: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e480: 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20      mutexOpen = 
e490: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
e4a0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
e4b0: 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20  TATIC_OPEN);.   
e4c0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e4d0: 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e  _enter(mutexOpen
e4e0: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  );.      mutexSh
e4f0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
e500: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
e510: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
e520: 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  TER);.      sqli
e530: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e540: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
e550: 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
e560: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
e570: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
e580: 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
e590: 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
e5a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
e5b0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
e5c0: 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
e5d0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
e5e0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
e5f0: 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
e600: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
e610: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
e620: 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
e630: 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
e640: 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
e650: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
e660: 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
e670: 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
e680: 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
e690: 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
e6a0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
e6b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
e6c0: 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
e6d0: 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
e6e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
e6f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e700: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
e710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
e720: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
e730: 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e750: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
e760: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
e770: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e780: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e790: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e7a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
e7b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
e7c0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e7d0: 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
e7e0: 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
e7f0: 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
e800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e820: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e830: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
e840: 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
e850: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
e860: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
e870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e880: 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
e890: 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
e8a0: 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
e8b0: 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
e8c0: 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
e8d0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
e8e0: 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
e8f0: 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
e900: 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
e910: 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
e920: 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
e930: 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
e940: 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
e950: 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
e960: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
e970: 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
e980: 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
e990: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
e9a0: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
e9b0: 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
e9c0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
e9d0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
e9e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
e9f0: 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
ea00: 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
ea10: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
ea20: 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
ea30: 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
ea40: 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
ea50: 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
ea60: 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
ea70: 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
ea80: 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
ea90: 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
eaa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
eab0: 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
eac0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34  =8 || sizeof(i64
ead0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
eae0: 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
eaf0: 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34  =8 || sizeof(u64
eb00: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
eb10: 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
eb20: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
eb30: 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
eb40: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
eb50: 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
eb60: 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
eb70: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
eb80: 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
eb90: 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
eba0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
ebb0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ebc0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
ebd0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
ebe0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ebf0: 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
ec00: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
ec10: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec30: 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
ec40: 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
ec50: 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
ec60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ec70: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ec80: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
ec90: 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
eca0: 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
ecb0: 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
ecc0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
ecd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ece0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
ecf0: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
ed00: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62     }.    pBt->db
ed10: 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
ed20: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
ed30: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
ed40: 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
ed50: 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
ed60: 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
ed70: 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70  t;.  .    pBt->p
ed80: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20  Cursor = 0;.    
ed90: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
eda0: 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e  .    pBt->readOn
edb0: 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ly = sqlite3Page
edc0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
edd0: 3e 70 50 61 67 65 72 29 3b 0a 23 69 66 64 65 66  >pPager);.#ifdef
ede0: 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
edf0: 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 73  ELETE.    pBt->s
ee00: 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 31 3b  ecureDelete = 1;
ee10: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d  .#endif.    pBt-
ee20: 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
ee30: 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
ee40: 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
ee50: 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
ee60: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
ee70: 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
ee80: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
ee90: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
eea0: 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
eeb0: 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
eec0: 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
eed0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
eee0: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
eef0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ef00: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
ef10: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
ef20: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
ef30: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
ef40: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
ef50: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
ef60: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
ef70: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
ef80: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
ef90: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
efa0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
efb0: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
efc0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
efd0: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
efe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
eff0: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
f000: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
f010: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
f020: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
f030: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
f040: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
f050: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
f060: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
f070: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
f080: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
f090: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
f0a0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
f0b0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
f0c0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f0d0: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
f0e0: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
f0f0: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
f100: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
f110: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
f120: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
f130: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
f140: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f150: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
f160: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
f170: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f180: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
f190: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f1a0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
f1b0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
f1c0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
f1d0: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
f1e0: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
f1f0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
f200: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
f210: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
f220: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
f230: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f240: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f250: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
f260: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
f270: 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
f280: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
f290: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f2a0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
f2b0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
f2c0: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
f2d0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
f2e0: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
f2f0: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
f300: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
f310: 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
f320: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f330: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f340: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
f350: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
f360: 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
f370: 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
f380: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
f390: 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
f3a0: 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
f3b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
f3c0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
f3d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
f3e0: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
f3f0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
f400: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
f410: 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
f420: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f430: 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
f440: 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  ER);.      if( S
f450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
f460: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
f470: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
f480: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
f490: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
f4a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
f4b0: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
f4c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
f4d0: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
f4e0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f4f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
f500: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
f510: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
f520: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f530: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
f540: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f550: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f560: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
f570: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
f580: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
f590: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
f5a0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
f5b0: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
f5c0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
f5d0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
f5e0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
f5f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f600: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f610: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
f620: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
f630: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
f640: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
f650: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f660: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
f670: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
f680: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
f690: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
f6a0: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
f6b0: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
f6c0: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
f6d0: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
f6e0: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
f6f0: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
f700: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
f710: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
f720: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
f730: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
f740: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
f750: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
f760: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
f770: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f780: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
f790: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f7a0: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
f7b0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
f7c0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
f7d0: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
f7e0: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
f7f0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
f800: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
f810: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
f820: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
f830: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
f840: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
f850: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
f860: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f870: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
f880: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
f890: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
f8a0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
f8b0: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
f8c0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
f8d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
f8e0: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
f8f0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
f900: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
f910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
f920: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
f930: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
f940: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
f950: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
f960: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
f970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f990: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
f9a0: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
f9b0: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
f9c0: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
f9d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f9e0: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
f9f0: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
fa00: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fa10: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
fa20: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
fa30: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
fa40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
fa50: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
fa60: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75   0;.  }.  if( mu
fa70: 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
fa80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fa90: 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
faa0: 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
fab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fac0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
fad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fae0: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
faf0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
fb00: 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
fb10: 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
fb20: 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
fb30: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
fb40: 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
fb50: 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
fb60: 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
fb70: 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
fb80: 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
fb90: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
fba0: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
fbb0: 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
fbc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
fbd0: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
fbe0: 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
fbf0: 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
fc00: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
fc10: 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f  CACHE.  sqlite3_
fc20: 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a  mutex *pMaster;.
fc30: 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
fc40: 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
fc50: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
fc60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
fc70: 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
fc80: 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20  x) );.  pMaster 
fc90: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fca0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fcb0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
fcc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fcd0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
fce0: 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
fcf0: 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
fd00: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
fd10: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
fd20: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
fd30: 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
fd40: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
fd50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fd60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
fd70: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
fd80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
fd90: 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
fda0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fdb0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
fdc0: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
fdd0: 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
fde0: 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
fdf0: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
fe00: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
fe10: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fe20: 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
fe30: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
fe40: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
fe50: 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
fe60: 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
fe70: 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
fe80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fe90: 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
fea0: 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
feb0: 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
fec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fed0: 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
fee0: 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
fef0: 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
ff00: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
ff10: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
ff20: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
ff30: 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
ff40: 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
ff50: 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
ff60: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
ff70: 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
ff80: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
ff90: 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
ffa0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
ffb0: 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
ffc0: 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
ffd0: 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
ffe0: 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
fff0: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
10000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
10010 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
10020 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
10030 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
10040 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
10050 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
10060 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
10070 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
10080 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
10090 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
100a0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
100b0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
100c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
100d0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
100e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
100f0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
10100 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
10110 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
10120 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
10130 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
10140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10150 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10160 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10170 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10180 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
10190 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
101a0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
101b0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
101c0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
101d0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
101e0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
101f0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
10200 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10210 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
10220 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10230 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
10240 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
10250 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
10260 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
10270 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
10280 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
10290 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
102a0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
102b0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
102c0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
102d0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
102e0 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck(p);.  sqlite3
102f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
10300 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
10310 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
10320 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
10330 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
10340 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
10350 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
10360 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
10370 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
10380 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
10390 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
103a0 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
103b0 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
103c0 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
103d0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
103e0 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
103f0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
10400 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
10410 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
10420 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
10430 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
10440 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
10450 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
10460 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
10470 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
10480 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
10490 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
104a0 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
104b0 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
104c0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
104d0 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
104e0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
104f0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
10500 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
10510 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
10520 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
10530 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
10540 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
10550 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
10560 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53  bFree(0, pBt->pS
10570 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
10580 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
10590 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
105a0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
105b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
105c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
105d0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
105e0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
105f0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
10600 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
10610 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
10620 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
10630 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
10640 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
10650 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
10660 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10670 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10690 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
106a0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
106b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
106c0 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
106d0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
106e0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
106f0 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
10700 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
10710 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
10720 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
10730 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10740 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
10750 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
10760 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10770 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10780 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10790 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
107a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
107b0 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
107c0 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
107d0 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
107e0 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
107f0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10800 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
10810 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
10820 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
10830 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
10840 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
10850 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
10860 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
10870 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
10880 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
10890 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
108a0 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
108b0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
108c0 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
108d0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
108e0 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
108f0 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
10900 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
10910 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
10920 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
10930 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
10940 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
10950 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
10960 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
10970 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
10980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10990 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
109a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
109b0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
109c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
109d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
109e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
109f0 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
10a00 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
10a10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10a20 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
10a30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10a40 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10a50 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
10a60 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
10a70 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
10a80 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
10a90 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
10aa0 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
10ab0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
10ac0 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
10ad0 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
10ae0 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
10af0 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
10b00 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
10b10 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
10b20 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
10b30 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10b40 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
10b50 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
10b60 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
10b70 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
10b80 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
10b90 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
10ba0 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
10bb0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
10bc0 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
10bd0 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
10be0 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
10bf0 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
10c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c10 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
10c20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
10c30 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74  etSafetyLevel(Bt
10c40 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65  ree *p, int leve
10c50 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29  l, int fullSync)
10c60 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
10c70 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
10c80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10c90 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10ca0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10cb0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10cc0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
10cd0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
10ce0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
10cf0 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  l, fullSync);.  
10d00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10d10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
10d20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
10d30 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
10d40 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
10d50 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
10d60 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
10d70 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
10d80 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
10d90 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
10da0 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
10db0 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
10dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
10dd0 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
10de0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
10df0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
10e00 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
10e10 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10e20 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
10e30 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
10e40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10e50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
10e60 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
10e70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10e80 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
10e90 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
10ea0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10eb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10ec0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
10ed0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
10ee0 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
10ef0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10f00 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43  _VACUUM)./*.** C
10f10 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
10f20 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
10f30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
10f40 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
10f50 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
10f60 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
10f70 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10f80 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
10f90 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
10fa0 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
10fb0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
10fc0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
10fd0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
10fe0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
10ff0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
11000 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
11010 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
11020 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
11030 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
11040 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
11050 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
11060 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
11070 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11080 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11090 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
110a0 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
110b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
110c0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
110d0 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
110e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
110f0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
11100 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
11110 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
11120 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
11130 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
11140 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
11150 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
11160 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
11170 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11180 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11190 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
111a0 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
111b0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
111c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
111d0 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
111e0 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
111f0 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
11200 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
11210 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
11220 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
11230 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
11240 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11250 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
11260 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
11270 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
11280 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
11290 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
112a0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
112b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
112c0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
112d0 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
112e0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
112f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11300 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11310 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
11320 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
11330 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
11340 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
11350 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
11360 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
11370 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
11380 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
11390 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
113a0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
113b0 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
113c0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
113d0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
113e0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
113f0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11400 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
11410 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
11420 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11430 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11440 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11450 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11460 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11470 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11480 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11490 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
114a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
114b0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
114c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
114d0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
114e0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
114f0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11500 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11510 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11520 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11530 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11540 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11550 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11560 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11580 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11590 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
115a0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
115b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
115c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
115d0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
115e0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
115f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11600 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11610 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11620 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11630 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11640 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11650 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11660 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11670 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11680 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11690 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
116a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
116b0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
116c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
116d0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
116e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
116f0 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11700 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11710 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11720 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11730 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11740 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11750 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11760 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11770 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11780 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11790 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
117a0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
117b0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
117c0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
117d0 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
117e0 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
117f0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11810 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11820 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11830 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11840 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11850 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
11860 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
11870 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
11880 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
11890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
118a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
118b0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
118c0 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
118d0 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
118e0 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
118f0 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
11900 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
11910 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
11920 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
11930 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
11940 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
11950 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
11960 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11970 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
11980 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11990 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
119a0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
119b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
119c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
119d0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
119e0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
119f0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
11a00 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
11a10 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
11a20 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
11a30 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
11a40 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11a50 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
11a60 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11a70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
11a80 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11a90 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11aa0 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
11ab0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
11ac0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
11ad0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
11ae0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
11af0 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
11b00 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
11b10 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
11b20 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
11b30 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
11b40 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
11b50 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
11b60 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
11b70 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
11b80 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
11b90 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
11ba0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
11bb0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
11bc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11bd0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
11be0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
11bf0 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
11c00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11c10 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11c20 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
11c30 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
11c40 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11c50 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
11c60 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
11c70 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
11c80 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11c90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11ca0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11cb0 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
11cc0 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
11cd0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
11ce0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
11cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
11d00 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
11d10 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
11d20 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
11d30 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
11d40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11d50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11d60 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
11d70 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
11d80 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
11d90 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
11da0 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
11db0 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
11dc0 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
11dd0 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
11de0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11df0 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
11e00 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
11e10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11e20 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
11e30 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11e40 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
11e50 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
11e60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11e70 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
11e80 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
11e90 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
11ea0 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
11eb0 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
11ec0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
11ed0 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
11ee0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
11ef0 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
11f00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
11f20 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
11f30 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
11f40 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
11f50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
11f60 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
11f70 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
11f80 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
11f90 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
11fa0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
11fb0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
11fc0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
11fd0 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
11fe0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
11ff0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
12000 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
12010 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
12020 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12030 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
12040 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
12050 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12060 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12070 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12080 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12090 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
120a0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
120b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
120c0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
120d0 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
120e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
120f0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
12100 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12110 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12120 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12130 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12140 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12150 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12160 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12170 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12180 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12190 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
121a0 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
121b0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
121c0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
121d0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
121e0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
121f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12200 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12210 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12220 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
12230 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12240 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
12250 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12270 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12280 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12290 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
122a0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
122b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
122c0 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
122d0 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
122e0 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
122f0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
12300 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
12310 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
12320 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12330 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12340 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12350 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12360 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12370 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12380 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12390 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
123a0 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
123b0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
123c0 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
123d0 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
123e0 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
123f0 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
12400 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
12410 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
12420 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12430 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12440 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12450 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12460 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12470 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12480 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12490 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
124a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
124b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
124c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
124d0 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
124e0 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
124f0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12500 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12510 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12520 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12530 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12540 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12550 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12560 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12570 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12580 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12590 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
125a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
125b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
125c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
125d0 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
125e0 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
125f0 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12600 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12610 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12620 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12630 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12640 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12650 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12660 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12670 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12680 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12690 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
126a0 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
126b0 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
126c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
126d0 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
126e0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
126f0 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12700 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12710 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12720 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12730 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12740 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12750 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12760 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12770 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12780 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12790 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
127a0 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
127b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
127c0 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
127d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
127e0 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
127f0 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12800 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12820 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12830 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12840 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12850 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
12860 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
12870 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
12880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12890 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
128a0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
128b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
128c0 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
128d0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
128e0 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
128f0 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
12900 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
12910 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
12920 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
12930 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
12940 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
12950 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
12960 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
12970 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
12980 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
12990 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
129a0 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
129b0 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
129c0 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
129d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
129e0 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
129f0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
12a00 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
12a10 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12a20 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
12a30 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
12a40 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
12a50 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
12a60 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31  if( ((pageSize-1
12a70 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20  )&pageSize)!=0. 
12a80 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e      || pageSize>
12a90 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
12aa0 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61  SIZE .     || pa
12ab0 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20  geSize<=256 .   
12ac0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12ad0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
12af0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
12b00 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
12b10 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
12b20 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
12b30 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67      if( (u32)pag
12b40 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
12b50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
12b60 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
12b70 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
12b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
12b90 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
12ba0 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
12bb0 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
12bc0 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
12bd0 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
12be0 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
12bf0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
12c00 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
12c10 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
12c20 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
12c30 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
12c40 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
12c50 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
12c60 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
12c70 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
12c80 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
12c90 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
12ca0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
12cb0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
12cc0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
12cd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
12ce0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
12cf0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
12d00 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
12d10 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
12d20 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
12d30 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
12d40 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
12d50 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
12d60 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
12d90 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  -usableSize);.  
12da0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12db0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 50 61     }.    if( nPa
12dc0 67 65 48 65 61 64 65 72 3e 6e 50 61 67 65 46 69  geHeader>nPageFi
12dd0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
12de0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
12df0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
12e00 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12e10 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
12e20 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
12e30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12e40 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12e50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
12e60 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
12e70 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
12e80 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
12e90 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
12ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12eb0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
12ec0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
12ed0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
12ee0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
12ef0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
12f00 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
12f10 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
12f20 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
12f30 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
12f40 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
12f50 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
12f60 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
12f70 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
12f80 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
12f90 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
12fa0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
12fb0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
12fc0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
12fd0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
12fe0 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
12ff0 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13000 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13010 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13020 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13030 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
13040 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
13050 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
13060 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
13070 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
13080 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
13090 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
130a0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
130b0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
130c0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
130d0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
130e0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
130f0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13100 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13110 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13120 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13130 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
13140 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
13150 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
13160 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
13170 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
13180 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
13190 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
131a0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
131b0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
131c0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
131d0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
131e0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
131f0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
13200 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
13210 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
13220 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
13230 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
13240 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13250 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
13260 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
13270 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
13280 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
13290 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
132a0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
132b0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
132c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
132d0 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
132e0 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
132f0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13300 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13310 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13320 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13330 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
13340 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
13350 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
13360 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
13370 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
13380 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
13390 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
133a0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
133b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
133c0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
133d0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
133e0 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
133f0 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13400 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13410 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13420 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13440 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
13450 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13460 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
13470 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
13480 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
13490 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
134a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
134b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
134c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
134d0 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
134e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
134f0 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13500 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13510 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13520 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13530 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
13540 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13550 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13560 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13570 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
13580 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
13590 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
135a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
135b0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
135c0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
135d0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
135e0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
135f0 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
13600 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
13610 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
13620 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
13630 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
13640 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
13650 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
13660 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
13670 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
13680 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
13690 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
136a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
136b0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
136c0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
136d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
136e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
136f0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
13700 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
13710 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
13720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13730 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
13740 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
13750 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
13760 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
13770 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
13780 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
13790 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
137a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
137b0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
137c0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
137d0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
137e0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
137f0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
13800 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
13810 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
13820 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
13830 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
13840 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
13850 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
13860 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
13870 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
13880 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
13890 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
138a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
138b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
138c0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
138d0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
138e0 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
138f0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
13900 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
13910 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
13920 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
13930 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
13940 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
13950 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
13960 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
13970 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
13980 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
13990 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
139a0 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
139b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
139c0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
139d0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
139e0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
139f0 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
13a00 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
13a10 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
13a20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
13a30 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
13a40 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
13a50 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
13a60 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
13a70 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
13a80 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
13a90 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
13aa0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
13ab0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
13ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13ad0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
13ae0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
13af0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
13b00 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
13b10 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
13b20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13b30 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
13b40 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
13b50 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
13b60 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
13b70 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
13b80 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
13b90 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
13ba0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
13bb0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
13bc0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
13bd0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
13be0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
13bf0 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
13c00 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
13c10 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
13c20 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
13c30 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
13c40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
13c50 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
13c60 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
13c70 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
13c80 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
13c90 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
13ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
13cb0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
13cc0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
13cd0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
13ce0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
13cf0 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
13d00 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
13d10 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
13d20 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
13d30 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
13d40 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
13d50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
13d60 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
13d70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13d80 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
13d90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
13da0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
13db0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
13dc0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
13dd0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
13de0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
13df0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13e00 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
13e10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
13e20 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
13e30 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
13e40 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
13e50 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
13e60 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
13e70 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
13e80 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
13e90 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
13ea0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
13eb0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13ec0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
13ed0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
13ee0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
13ef0 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
13f00 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
13f10 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13f20 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
13f30 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
13f40 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
13f50 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
13f60 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
13f70 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
13f80 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
13f90 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
13fa0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
13fb0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
13fc0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
13fd0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
13fe0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
13ff0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14000 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14010 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
14020 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
14030 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
14040 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
14050 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
14060 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
14070 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
14080 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
14090 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
140a0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
140b0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
140c0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
140d0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
140e0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
140f0 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
14100 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
14110 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
14120 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
14130 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
14140 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
14150 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
14160 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
14170 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
14180 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
14190 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
141a0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
141b0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
141c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
141d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
141e0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
141f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
14200 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
14220 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
14230 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
14240 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
14250 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
14260 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
14270 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
14280 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
14290 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
142a0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
142b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
142c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
142d0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
142e0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
142f0 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
14300 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14310 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14320 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
14330 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
14340 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
14350 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
14360 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14370 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
14380 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
14390 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
143a0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
143b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
143c0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
143d0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
143e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
143f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
14400 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
14410 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
14420 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
14430 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
14440 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
14450 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
14460 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
14470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14480 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
14490 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
144a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
144b0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
144c0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
144d0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
144e0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
144f0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14500 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14510 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14520 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14530 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14540 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14550 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14560 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14570 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14580 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14590 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
145a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
145b0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
145c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
145d0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
145e0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
145f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
14600 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
14610 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
14620 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
14630 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
14640 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
14650 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
14660 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
14670 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
14680 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
14690 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
146a0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
146b0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
146c0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
146d0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
146e0 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
146f0 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
14700 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
14710 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
14720 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
14730 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
14740 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
14750 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14760 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61  ;..  pBt->initia
14770 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28  llyEmpty = (u8)(
14780 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a  pBt->nPage==0);.
14790 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
147a0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
147b0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
147c0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
147d0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
147e0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
147f0 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
14800 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
14810 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
14820 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
14830 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
14840 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
14850 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
14860 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
14870 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
14880 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
14890 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
148a0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
148b0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
148c0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
148d0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
148e0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
148f0 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
14900 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
14910 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
14920 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
14930 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
14940 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
14950 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
14960 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
14970 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
14980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
14990 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
149a0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
149b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
149c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
149d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
149e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
149f0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
14a00 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
14a10 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
14a20 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
14a30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
14a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14a50 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
14a60 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
14a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14a80 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
14a90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14aa0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
14ab0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14ac0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
14ad0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
14ae0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
14af0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14b00 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
14b10 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
14b20 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
14b30 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
14b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14b50 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
14b60 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
14b70 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
14b80 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
14b90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14ba0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
14bb0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
14bc0 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
14bd0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
14be0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
14bf0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
14c00 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
14c10 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
14c20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
14c30 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
14c40 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
14c50 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
14c60 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
14c70 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
14c80 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
14c90 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
14ca0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
14cb0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
14cc0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
14cd0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
14ce0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
14cf0 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
14d00 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
14d10 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
14d20 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
14d30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14d40 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14d50 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
14d60 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
14d70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
14d80 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
14d90 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
14da0 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
14db0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
14dc0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
14dd0 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
14de0 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
14df0 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
14e00 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
14e10 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
14e20 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
14e30 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
14e40 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
14e50 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
14e60 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
14e70 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
14e80 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
14e90 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
14ea0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
14eb0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
14ec0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
14ed0 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
14ee0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
14ef0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
14f00 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
14f10 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
14f20 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
14f30 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
14f40 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
14f50 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
14f60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14f70 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
14f80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
14f90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14fa0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
14fb0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
14fc0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
14fd0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
14fe0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14ff0 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15000 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15010 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15020 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15030 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
15040 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
15050 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
15060 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
15070 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
15080 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
15090 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
150a0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
150b0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
150c0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
150d0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
150e0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
150f0 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15100 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15110 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15120 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15130 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15140 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
15150 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15160 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15170 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15180 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
15190 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
151a0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
151b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
151c0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
151d0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
151e0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
151f0 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15200 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15210 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15220 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15230 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
15240 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
15250 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
15260 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
15270 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
15280 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
15290 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
152a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
152c0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
152d0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15300 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15310 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15320 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15340 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15350 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15360 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
15370 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
15380 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
15390 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
153a0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
153b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
153c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
153d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
153e0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
153f0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15410 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15420 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15430 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15440 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15460 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15470 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15480 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15490 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
154a0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
154b0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
154c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
154d0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
154e0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
154f0 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15500 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15510 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15520 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15530 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15540 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15550 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
15560 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
15570 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15580 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15590 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
155a0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
155b0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
155c0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
155d0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
155e0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
155f0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
15600 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
15610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
15620 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
15630 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
15640 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
15650 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
15660 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
15670 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
15680 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
15690 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
156a0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
156b0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
156c0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
156d0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
156e0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
156f0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
15700 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
15710 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
15740 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
15750 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
15760 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
15770 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
15780 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
15790 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
157a0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
157b0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
157c0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
157d0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
157e0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
157f0 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
15800 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
15810 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
15820 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
15830 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
15840 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
15850 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
15860 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
15870 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
15880 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
15890 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
158a0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
158b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
158c0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
158d0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
158e0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
158f0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
15900 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
15910 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15920 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
15930 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
15940 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
15950 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
15960 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
15970 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
15980 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
15990 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
159a0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
159b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
159c0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
159d0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
159e0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
159f0 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
15a00 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
15a10 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
15a20 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
15a30 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
15a40 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
15a50 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
15a60 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
15a70 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
15a80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
15a90 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15aa0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
15ab0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15ac0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
15ad0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
15ae0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
15af0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
15b00 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
15b10 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
15b20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
15b30 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
15b40 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
15b50 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15b60 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
15b70 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
15b80 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
15b90 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
15ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
15bb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
15bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15be0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
15bf0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
15c00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
15c10 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
15c20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15c30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15c40 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
15c50 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
15c60 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
15c70 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
15c80 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
15c90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
15ca0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
15cb0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
15cc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
15cd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
15ce0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
15cf0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15d00 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
15d10 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
15d20 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
15d30 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
15d40 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
15d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d60 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
15d70 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
15d80 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
15d90 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
15da0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
15db0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
15dc0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
15dd0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
15de0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
15df0 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
15e00 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
15e10 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
15e20 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
15e30 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
15e40 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
15e50 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
15e60 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
15e70 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
15e80 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
15e90 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
15ea0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
15eb0 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
15ec0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
15ed0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
15ee0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
15ef0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
15f00 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
15f10 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
15f20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
15f30 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
15f40 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
15f50 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
15f60 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
15f70 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
15f80 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
15f90 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
15fa0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
15fb0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
15fc0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
15fd0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
15fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
15ff0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
16000 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
16010 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
16020 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
16030 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
16040 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
16050 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
16060 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
16070 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
16080 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
16090 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
160a0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
160b0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
160c0 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
160d0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
160e0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
160f0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16100 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16110 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
16120 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
16130 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
16140 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
16150 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
16160 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
16170 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16180 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16190 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
161a0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
161b0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
161c0 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
161d0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
161e0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
161f0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
16200 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
16210 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
16220 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
16230 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
16240 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
16250 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
16260 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
16270 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
16280 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16290 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
162a0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
162b0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
162c0 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
162d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
162e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
162f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
16300 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
16310 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
16320 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
16330 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
16340 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
16350 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
16360 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
16370 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
16380 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
16390 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
163a0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
163b0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
163c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
163d0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
163e0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
163f0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
16400 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
16410 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
16420 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
16430 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
16440 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
16450 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
16460 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
16470 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
16480 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
16490 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
164a0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
164b0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
164c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
164d0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
164e0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
164f0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
16500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16520 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16530 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
16540 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
16550 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
16560 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
16570 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
16580 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16590 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
165a0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
165b0 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
165c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
165d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
165e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
165f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16600 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
16610 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
16620 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
16630 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
16640 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
16650 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
16660 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
16670 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
16680 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
16690 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
166a0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
166b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
166c0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
166d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
166e0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
166f0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
16700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16710 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16720 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
16730 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16740 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
16750 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
16760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16770 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16780 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
16790 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
167a0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
167b0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
167c0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
167d0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
167e0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
167f0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
16800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
16820 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
16830 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
16840 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
16850 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
16860 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
16870 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
16880 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
16890 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
168a0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
168b0 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
168c0 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
168d0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
168e0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
168f0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
16900 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
16910 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
16920 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
16930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16940 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
16950 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
16960 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
16970 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
16980 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
16990 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
169a0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
169b0 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
169c0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
169d0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
169e0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
169f0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
16a00 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
16a10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
16a20 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
16a30 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
16a40 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
16a50 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
16a60 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
16a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
16a80 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
16a90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
16aa0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
16ab0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
16ac0 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
16ad0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
16ae0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
16af0 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
16b00 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16b10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16b20 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
16b30 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
16b40 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
16b50 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
16b60 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
16b70 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
16b80 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
16b90 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
16ba0 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
16bb0 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
16bc0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
16bd0 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
16be0 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
16bf0 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
16c00 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
16c10 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
16c20 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
16c30 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
16c40 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
16c50 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
16c60 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
16c70 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
16c80 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
16c90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
16ca0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
16cb0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
16cc0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16cd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16ce0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
16d00 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
16d10 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
16d20 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
16d30 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
16d40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
16d50 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
16d60 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
16d70 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
16d80 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
16d90 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16da0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
16db0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
16dc0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
16dd0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16de0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
16df0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
16e00 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
16e10 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
16e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16e30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16e40 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
16e50 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
16e60 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
16e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16e80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
16e90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
16ea0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
16eb0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
16ec0 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
16ed0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
16ee0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
16ef0 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
16f00 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
16f10 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
16f20 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
16f30 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
16f40 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
16f50 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
16f60 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
16f70 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
16f80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
16f90 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
16fa0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
16fb0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
16fc0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
16fd0 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
16fe0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16ff0 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
17000 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
17010 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
17020 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
17030 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
17040 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
17050 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
17060 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17080 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17090 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
170a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
170b0 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
170c0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
170d0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
170e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
170f0 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
17100 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
17110 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
17120 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
17130 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
17140 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
17150 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
17160 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
17170 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17180 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
17190 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
171a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
171b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
171c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
171d0 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
171e0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
171f0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
17200 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
17210 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
17220 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
17230 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
17240 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
17250 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
17260 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
17270 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
17280 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
17290 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
172a0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
172b0 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
172c0 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
172d0 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
172e0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
172f0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
17300 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
17310 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
17320 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17330 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17340 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17350 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17360 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
17370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17390 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
173a0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
173b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
173c0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
173d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
173e0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
173f0 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
17400 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
17410 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
17420 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
17430 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
17440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17450 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
17460 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
17470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17480 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17490 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
174a0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
174b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
174c0 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
174d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
174e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
174f0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
17500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17510 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17520 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17530 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
17540 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
17550 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
17560 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
17570 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17580 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
17590 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
175a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
175b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
175c0 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
175d0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
175e0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
175f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17600 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
17610 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17630 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
17640 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17660 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17670 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
17680 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17690 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
176a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
176b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
176c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
176d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
176e0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
176f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
17700 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
17710 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
17720 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
17730 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
17740 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
17750 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17760 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
17770 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
17780 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
17790 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
177a0 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
177b0 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
177c0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
177d0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
177e0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
177f0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
17800 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
17810 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
17820 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
17830 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
17840 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
17850 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
17860 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
17870 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
17880 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
17890 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
178a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
178b0 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
178c0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
178d0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
178e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
178f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17900 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17910 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
17920 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
17930 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
17940 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
17950 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
17960 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
17970 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
17980 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
17990 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
179a0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
179b0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
179c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
179d0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
179e0 30 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  0, btreePagecoun
179f0 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28  t(pBt));.    if(
17a00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17a10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
17a20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17a30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
17a40 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
17a50 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17a60 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
17a70 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
17a80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17a90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17aa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17ab0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17ac0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
17ad0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
17ae0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
17af0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
17b00 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
17b10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
17b20 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
17b30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
17b40 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
17b50 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
17b60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17b70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17b80 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
17b90 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
17ba0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
17bb0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
17bc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17bd0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
17be0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
17bf0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
17c00 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
17c10 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
17c20 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
17c30 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
17c40 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
17c50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
17c60 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
17c70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
17c80 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
17c90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
17ca0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
17cb0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
17cc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17cd0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17ce0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
17cf0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
17d00 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
17d10 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
17d20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
17d30 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
17d40 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
17d50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17d60 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
17d70 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
17d80 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
17d90 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
17da0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
17db0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
17dc0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
17dd0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
17de0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17df0 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
17e00 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
17e10 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
17e20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
17e30 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
17e40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  */.    int nEntr
17e50 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  y;        /* Num
17e60 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
17e70 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
17e80 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  e */.    Pgno nO
17e90 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
17ea0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
17eb0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
17ec0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
17ed0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
17ee0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
17ef0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
17f00 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
17f10 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17f20 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
17f30 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
17f40 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
17f50 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
17f60 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
17f70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
17f80 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
17f90 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
17fa0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
17fb0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
17fc0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
17fd0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
17fe0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
17ff0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
18000 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18010 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
18020 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
18030 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18040 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
18050 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
18060 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
18070 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
18080 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
18090 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
180a0 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
180b0 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
180c0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
180d0 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
180e0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
180f0 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
18100 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
18110 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
18120 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
18130 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
18140 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
18150 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
18160 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18170 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
18180 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
18190 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
181a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
181b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
181c0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
181d0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
181f0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
18200 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
18210 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
18220 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
18230 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
18240 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
18250 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
18260 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
18270 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18280 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
18290 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
182a0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
182b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
182c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
182d0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
182e0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
182f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18300 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18310 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
18320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18330 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
18340 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
18350 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
18360 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
18370 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
18380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18390 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
183a0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
183b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
183c0 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
183d0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
183e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
183f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
18400 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
18410 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18420 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
18430 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
18440 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
18450 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
18460 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
18470 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
18480 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
18490 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
184a0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
184b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
184c0 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
184d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
184e0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
184f0 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
18500 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
18510 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
18520 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
18530 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
18540 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
18550 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
18560 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
18570 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
18580 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
18590 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
185a0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
185b0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
185c0 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
185d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
185e0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
185f0 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
18600 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
18610 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
18620 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
18630 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
18640 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
18650 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
18660 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
18670 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
18680 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
18690 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
186a0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
186b0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
186c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
186d0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
186e0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
186f0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
18700 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
18710 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
18720 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
18730 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
18740 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
18750 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
18760 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
18770 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
18780 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
18790 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
187a0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
187b0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
187c0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
187d0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
187e0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
187f0 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
18800 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
18810 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
18820 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
18830 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
18840 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
18850 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18860 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
18870 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
18880 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
18890 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
188a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
188b0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
188c0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
188d0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
188e0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
188f0 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
18900 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
18910 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
18920 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
18930 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
18940 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
18950 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
18960 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
18970 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
18980 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
18990 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
189a0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
189b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
189c0 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
189d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
189e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
189f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
18a00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
18a10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
18a20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
18a30 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
18a40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18a50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18a60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18a70 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
18a80 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
18a90 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
18aa0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
18ab0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18ac0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18ad0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18ae0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
18af0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18b00 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
18b10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18b20 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
18b30 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
18b40 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
18b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18b60 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
18b70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18b80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18b90 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
18ba0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
18bb0 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
18bc0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
18bd0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
18be0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
18bf0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
18c00 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
18c10 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
18c20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
18c30 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
18c40 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
18c50 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
18c60 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72  );..  btreeClear
18c70 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
18c80 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
18c90 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
18ca0 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
18cb0 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
18cc0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
18cd0 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
18ce0 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
18cf0 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
18d00 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
18d10 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
18d20 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
18d30 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
18d40 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
18d50 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
18d60 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
18d70 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
18d80 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
18d90 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
18da0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
18db0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
18dc0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
18dd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
18de0 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
18df0 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
18e00 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
18e10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
18e20 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
18e30 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
18e40 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
18e50 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
18e60 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
18e70 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
18e80 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
18e90 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
18ea0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
18eb0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
18ec0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
18ed0 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
18ee0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
18ef0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
18f00 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
18f10 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
18f20 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
18f30 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
18f40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
18f50 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
18f60 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
18f70 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
18f80 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
18f90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18fa0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
18fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
18fc0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
18fd0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
18fe0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
18ff0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
19000 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
19010 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
19020 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
19030 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
19040 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
19050 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
19060 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
19070 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
19080 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
19090 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
190a0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
190b0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
190c0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
190d0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
190e0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
190f0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
19100 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
19110 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
19120 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
19130 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
19140 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
19150 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
19160 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
19170 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
19180 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19190 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
191a0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
191b0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
191c0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
191d0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
191e0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
191f0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
19200 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
19210 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
19220 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
19230 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
19240 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
19250 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
19260 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
19270 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
19280 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
19290 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
192a0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
192b0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
192c0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
192d0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
192e0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
192f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19300 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
19310 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
19320 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
19330 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
19340 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
19350 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
19360 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
19370 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
19380 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
19390 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
193a0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
193b0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
193c0 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
193d0 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
193e0 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
193f0 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
19400 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
19410 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
19420 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
19430 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
19440 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
19450 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19460 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
19470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
19480 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19490 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
194a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
194b0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
194c0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
194d0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
194e0 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
194f0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
19500 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19510 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19520 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
19530 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19540 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
19550 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
19560 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
19570 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
19580 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
19590 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
195a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
195b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
195c0 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
195d0 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
195e0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
195f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
19600 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
19610 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
19620 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
19630 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
19640 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
19650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
19670 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
19680 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  o(p);.  }.  sqli
19690 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
196a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
196b0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
196c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
196d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
196e0 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
196f0 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
19700 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
19710 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
19720 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
19730 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
19740 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
19750 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
19760 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
19770 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
19780 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
19790 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
197a0 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
197b0 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
197c0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
197d0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
197e0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
197f0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
19800 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
19810 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
19820 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
19830 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
19840 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
19850 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
19860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
19870 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
19880 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19890 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
198a0 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
198b0 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
198c0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
198d0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
198e0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
198f0 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
19900 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
19910 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
19920 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
19930 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
19940 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
19950 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
19960 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
19970 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
19980 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
19990 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
199a0 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
199b0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
199c0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
199d0 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
199e0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
199f0 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
19a00 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
19a10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
19a20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
19a30 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
19a40 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
19a50 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
19a60 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
19a70 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
19a80 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
19a90 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
19aa0 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
19ab0 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
19ac0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
19ad0 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
19ae0 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
19af0 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
19b00 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
19b10 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
19b20 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
19b30 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
19b40 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
19b50 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
19b60 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
19b70 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
19b80 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
19b90 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
19ba0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19bb0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
19bc0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
19bd0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
19be0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
19bf0 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
19c00 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
19c10 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
19c20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
19c30 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
19c40 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
19c50 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
19c60 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
19c70 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
19c80 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
19c90 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
19ca0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19cb0 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
19cc0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
19cd0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
19ce0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
19cf0 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
19d00 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
19d10 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
19d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
19d30 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
19d40 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
19d50 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
19d60 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
19d70 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
19d80 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
19d90 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
19da0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
19db0 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
19dc0 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
19dd0 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
19de0 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
19df0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
19e00 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
19e10 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
19e20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19e30 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
19e40 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
19e50 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
19e60 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
19e70 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
19e80 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
19e90 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19ea0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
19eb0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19ec0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19ed0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
19ee0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
19ef0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
19f00 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
19f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19f20 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
19f30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19f40 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
19f50 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
19f60 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
19f70 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
19f80 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
19f90 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
19fa0 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
19fb0 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
19fc0 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
19fd0 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
19fe0 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
19ff0 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
1a000 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
1a010 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
1a020 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
1a030 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
1a040 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
1a050 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
1a060 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
1a070 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
1a080 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
1a090 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
1a0a0 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
1a0b0 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
1a0c0 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
1a0d0 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
1a0e0 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
1a0f0 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
1a100 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
1a110 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
1a120 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
1a130 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
1a140 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1a150 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
1a160 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1a170 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1a180 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
1a190 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
1a1a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a1b0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
1a1c0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1a1d0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
1a1e0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
1a1f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a200 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1a210 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
1a220 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1a230 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
1a240 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
1a250 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
1a260 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
1a270 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
1a280 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
1a290 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
1a2a0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
1a2b0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
1a2c0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1a2d0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
1a2e0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1a2f0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
1a300 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
1a310 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
1a320 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1a330 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
1a340 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
1a350 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
1a360 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
1a370 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
1a380 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a390 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
1a3a0 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
1a3b0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
1a3c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1a3d0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
1a3e0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
1a3f0 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
1a400 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
1a410 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a420 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
1a430 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
1a440 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
1a450 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a460 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
1a480 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
1a490 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1a4a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
1a4b0 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  can can be rolle
1a4c0 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
1a4d0 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
1a4e0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
1a4f0 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
1a500 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
1a510 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
1a520 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
1a530 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
1a540 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
1a550 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
1a560 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
1a570 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
1a580 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
1a590 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
1a5a0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
1a5b0 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
1a5c0 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
1a5d0 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
1a5e0 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
1a5f0 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
1a600 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
1a610 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
1a620 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
1a630 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
1a640 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
1a650 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
1a660 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
1a670 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
1a680 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1a690 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
1a6a0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
1a6b0 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
1a6c0 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
1a6d0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
1a6e0 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
1a6f0 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
1a700 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
1a710 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
1a720 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1a730 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
1a740 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
1a750 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
1a760 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
1a770 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
1a780 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
1a790 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1a7a0 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
1a7b0 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
1a7c0 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
1a7d0 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
1a7e0 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
1a7f0 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
1a800 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
1a810 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
1a820 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
1a830 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
1a840 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
1a850 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1a860 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1a870 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
1a880 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
1a890 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1a8a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a8b0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
1a8c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1a8d0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1a8e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1a8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1a900 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
1a910 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1a920 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1a930 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1a940 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1a950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1a960 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a970 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1a980 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1a990 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1a9a0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1a9b0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1a9c0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1a9d0 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1a9e0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1a9f0 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1aa00 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1aa10 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1aa20 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1aa30 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1aa40 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1aa50 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1aa60 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1aa70 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1aa80 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1aa90 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1aaa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1aab0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1aac0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1aad0 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1aae0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1aaf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ab00 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1ab10 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1ab20 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1ab30 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1ab40 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1ab50 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1ab60 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1ab70 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1ab80 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1ab90 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1aba0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1abb0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1abc0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1abd0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1abe0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1abf0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1ac00 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1ac10 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1ac20 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1ac30 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1ac40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1ac50 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1ac60 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1ac70 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1ac80 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1ac90 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1aca0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1acb0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1acc0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1acd0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1ace0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1acf0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1ad00 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1ad10 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1ad20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1ad30 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ad40 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1ad50 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1ad60 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1ad70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ad80 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1ad90 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ada0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1adb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1adc0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1add0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1ade0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1adf0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1ae00 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1ae10 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1ae20 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1ae30 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1ae40 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1ae50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ae60 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1ae70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1ae80 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1ae90 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1aea0 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1aeb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aec0 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1aed0 6f 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69  oint<0 && pBt->i
1aee0 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20  nitiallyEmpty ) 
1aef0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
1af00 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1af10 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1af20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1af30 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1af40 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1af50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1af60 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1af70 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1af80 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1af90 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1afa0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1afb0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1afc0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1afd0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1afe0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1aff0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1b000 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1b010 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1b020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1b030 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1b040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1b060 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1b070 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1b080 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1b090 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1b0a0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1b0b0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1b0c0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1b0d0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1b0e0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1b0f0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1b100 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1b110 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1b120 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1b130 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1b140 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1b150 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1b160 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1b170 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1b180 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1b190 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1b1a0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1b1b0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1b1c0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1b1d0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1b1e0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1b1f0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1b200 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1b210 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1b220 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1b230 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1b240 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1b250 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1b260 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1b270 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1b280 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1b290 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1b2a0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1b2b0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1b2c0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1b2d0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1b2e0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1b2f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b300 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1b310 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1b320 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1b330 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1b340 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1b350 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1b360 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1b370 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1b380 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1b390 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1b3a0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1b3b0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1b3c0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1b3d0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1b3e0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1b3f0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1b400 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1b410 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1b420 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1b430 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1b440 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1b450 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1b460 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1b470 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1b480 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1b490 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1b4a0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1b4b0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1b4c0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1b4d0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1b4e0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1b4f0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1b500 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1b510 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1b520 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1b530 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1b540 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1b550 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1b560 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1b570 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1b580 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1b590 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1b5a0 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1b5b0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1b5c0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1b5d0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1b5e0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b610 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1b620 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1b650 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1b660 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1b670 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b690 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1b6a0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1b6b0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1b6c0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1b6d0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1b6e0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1b6f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1b700 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b720 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1b730 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1b740 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1b750 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b770 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1b780 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1b790 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1b7a0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1b7b0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1b7c0 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1b7d0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1b7e0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1b7f0 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1b800 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1b810 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1b820 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1b830 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1b840 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1b850 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1b860 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1b870 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1b880 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1b890 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1b8a0 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1b8b0 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1b8c0 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1b8d0 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1b8e0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1b8f0 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1b900 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1b910 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1b920 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1b930 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1b940 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1b950 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1b960 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1b970 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1b980 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1b990 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1b9a0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1b9b0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1b9c0 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1b9d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1b9e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1b9f0 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1ba00 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1ba10 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1ba20 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e  g && pBt->readOn
1ba30 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ly) ){.    retur
1ba40 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
1ba50 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  Y;.  }.  if( iTa
1ba60 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1ba70 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1ba80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ba90 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
1baa0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1bab0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1bac0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1bad0 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1bae0 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1baf0 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1bb00 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1bb10 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1bb20 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1bb30 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1bb40 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1bb50 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1bb60 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1bb70 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1bb80 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1bb90 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1bba0 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  ;.  pCur->wrFlag
1bbb0 20 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20   = (u8)wrFlag;. 
1bbc0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
1bbd0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
1bbe0 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
1bbf0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
1bc00 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
1bc10 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
1bc20 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
1bc30 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1bc40 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70  SOR_INVALID;.  p
1bc50 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1bc60 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
1bc70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
1bc80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1bc90 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1bcd0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
1bd10 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
1bd20 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bd50 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1bd60 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1bd70 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1bd80 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1bd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1bda0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
1bdb0 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
1bdc0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1bdf0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
1be00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1be10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1be20 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
1be30 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
1be40 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
1be50 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
1be60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1be70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1be80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1be90 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1bea0 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
1beb0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
1bec0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
1bed0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
1bee0 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
1bef0 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
1bf00 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
1bf10 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
1bf20 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
1bf30 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
1bf40 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
1bf50 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
1bf60 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
1bf70 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
1bf80 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
1bf90 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
1bfa0 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
1bfb0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
1bfc0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
1bfd0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
1bfe0 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
1bff0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1c000 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1c010 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
1c020 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
1c030 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
1c040 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
1c050 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
1c060 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
1c070 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
1c080 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
1c090 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
1c0a0 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
1c0b0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
1c0c0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
1c0d0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
1c0e0 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
1c0f0 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
1c100 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
1c110 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
1c120 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
1c130 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
1c140 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
1c150 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
1c160 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
1c170 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
1c180 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
1c190 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a  or, iPage));.}..
1c1a0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
1c1b0 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
1c1c0 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
1c1d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
1c1e0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
1c1f0 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
1c200 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
1c210 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
1c220 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
1c230 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
1c240 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
1c250 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
1c260 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1c270 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
1c280 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
1c290 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
1c2a0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
1c2b0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
1c2c0 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
1c2d0 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
1c2e0 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
1c2f0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1c300 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
1c310 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
1c320 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
1c330 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
1c340 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
1c350 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
1c360 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
1c370 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
1c380 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
1c390 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
1c3a0 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
1c3b0 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
1c3c0 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
1c3d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
1c3e0 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
1c3f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
1c400 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1c410 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
1c420 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
1c430 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1c440 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
1c450 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1c460 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1c470 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1c480 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
1c490 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
1c4a0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
1c4b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1c4c0 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
1c4d0 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
1c4e0 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
1c4f0 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
1c500 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
1c510 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
1c520 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
1c530 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1c540 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
1c550 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
1c560 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
1c570 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
1c580 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
1c590 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
1c5a0 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
1c5b0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
1c5c0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1c5d0 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
1c5e0 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
1c5f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1c600 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
1c610 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
1c620 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
1c630 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
1c640 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1c650 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
1c660 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
1c670 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
1c680 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
1c690 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
1c6a0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
1c6b0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
1c6c0 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
1c6d0 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
1c6e0 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
1c6f0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
1c700 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
1c710 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c720 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1c730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c740 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
1c750 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1c760 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70  pPrev ){.      p
1c770 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  Cur->pPrev->pNex
1c780 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
1c790 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c7a0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1c7b0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
1c7c0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
1c7d0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
1c7e0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1c7f0 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65  rev = pCur->pPre
1c800 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  v;.    }.    for
1c810 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
1c820 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1c830 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1c840 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1c850 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b      }.    unlock
1c860 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1c870 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
1c880 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
1c890 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
1c8a0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
1c8b0 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
1c8c0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
1c8d0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1c8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c8f0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
1c900 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
1c910 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1c920 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
1c930 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1c940 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
1c950 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1c960 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
1c970 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1c980 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1c990 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1c9a0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1c9b0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1c9c0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1c9d0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1c9e0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1c9f0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1ca00 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
1ca10 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a  arseCell()..**.*
1ca20 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54  * 2007-06-25:  T
1ca30 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e  here is a bug in
1ca40 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
1ca50 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73  f MSVC that caus
1ca60 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  e the.** compile
1ca70 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20  r to crash when 
1ca80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73  getCellInfo() is
1ca90 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
1caa0 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20  a macro..** But 
1cab0 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75  there is a measu
1cac0 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76  reable speed adv
1cad0 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20  antage to using 
1cae0 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63  the macro on gcc
1caf0 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63  .** (when less c
1cb00 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61  ompiler optimiza
1cb10 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f  tions like -Os o
1cb20 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61  r -O0 are used a
1cb30 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  nd the.** compil
1cb40 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20  er is not doing 
1cb50 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69  agressive inlini
1cb60 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20  ng.)  So we use 
1cb70 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a  a real function.
1cb80 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20  ** for MSVC and 
1cb90 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72  a macro for ever
1cba0 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69  ything else.  Ti
1cbb0 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23  cket #2457..*/.#
1cbc0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1cbd0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
1cbe0 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
1cbf0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1cc00 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1cc10 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
1cc20 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
1cc30 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c  memset(&info, 0,
1cc40 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a   sizeof(info));.
1cc50 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1cc60 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1cc70 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
1cc80 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
1cc90 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
1cca0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
1ccb0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
1ccc0 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
1ccd0 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
1cce0 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
1ccf0 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
1cd00 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
1cd10 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
1cd20 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
1cd30 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
1cd40 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
1cd50 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
1cd60 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
1cd70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1cd80 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1cd90 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
1cda0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
1cdb0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1cdc0 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
1cdd0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1cde0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1cdf0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1ce00 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
1ce10 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1ce20 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1ce30 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1ce40 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1ce50 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1ce60 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1ce70 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1ce80 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1ce90 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1cea0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1ceb0 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1cec0 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1ced0 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1cf10 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1cf20 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1cf60 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1cf70 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1cfb0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1cfc0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1cfd0 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1cfe0 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1cff0 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75  info); \.    pCu
1d000 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1d010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d040 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73          \.  }els
1d050 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
1d0a0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
1d0b0 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a            \.  }.
1d0f0 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56  #endif /* _MSC_V
1d100 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e  ER */..#ifndef N
1d110 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
1d120 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
1d130 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1d140 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1d150 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
1d160 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
1d170 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
1d180 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
1d190 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
1d1a0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
1d1b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
1d1c0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
1d1d0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
1d1e0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
1d1f0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
1d200 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1d210 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1d220 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
1d230 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1d240 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
1d250 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
1d260 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
1d270 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1d280 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
1d290 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a   NDEBUG */../*.*
1d2a0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1d2b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d2c0 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f  buffer needed to
1d2d0 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20   hold the value 
1d2e0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f  of.** the key fo
1d2f0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
1d300 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72  try.  If the cur
1d310 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
1d320 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
1d330 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20  d entry, *pSize 
1d340 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a  is set to 0. .**
1d350 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20  .** For a table 
1d360 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20  with the INTKEY 
1d370 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72  flag set, this r
1d380 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1d390 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66  he key.** itself
1d3a0 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72  , not the number
1d3b0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
1d3c0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1d3d0 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69  caller must posi
1d3e0 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  tion the cursor 
1d3f0 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
1d400 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
1d410 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
1d420 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ine cannot fail.
1d430 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75    It always retu
1d440 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  rns SQLITE_OK.  
1d450 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d460 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75  treeKeySize(BtCu
1d470 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
1d480 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
1d490 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d4a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d4b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1d4c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1d4d0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
1d4e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d4f0 44 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  D );.  if( pCur-
1d500 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1d510 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53  VALID ){.    *pS
1d520 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ize = 0;.  }else
1d530 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66  {.    getCellInf
1d540 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53  o(pCur);.    *pS
1d550 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1d560 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74  .nKey;.  }.  ret
1d570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d580 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1d590 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
1d5a0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
1d5b0 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
1d5c0 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
1d5d0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1d5e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1d5f0 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
1d600 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
1d610 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1d620 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
1d630 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
1d640 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
1d650 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
1d660 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
1d670 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
1d680 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
1d690 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1d6a0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
1d6b0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
1d6c0 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
1d6d0 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
1d6e0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1d6f0 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
1d700 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
1d710 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
1d720 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
1d730 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
1d740 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
1d750 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
1d760 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
1d770 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1d780 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
1d790 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1d7a0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
1d7b0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1d7c0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1d7d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1d7e0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1d7f0 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
1d800 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
1d810 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
1d820 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75  fo.nData;.  retu
1d830 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d840 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1d850 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d860 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1d870 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d880 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
1d890 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
1d8a0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
1d8b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1d8c0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1d8d0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
1d8e0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
1d8f0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
1d900 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
1d910 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
1d920 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
1d930 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
1d940 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1d950 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
1d960 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
1d970 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
1d980 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1d990 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
1d9a0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
1d9b0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1d9c0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
1d9d0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1d9e0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
1d9f0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
1da00 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
1da10 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
1da20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
1da30 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
1da40 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
1da50 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
1da60 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
1da70 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
1da80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1da90 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
1daa0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1dab0 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
1dac0 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
1dad0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
1dae0 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
1daf0 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
1db00 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
1db10 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1db20 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
1db30 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
1db40 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
1db50 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
1db60 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
1db70 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
1db80 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
1db90 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
1dba0 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
1dbb0 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
1dbc0 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
1dbd0 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
1dbe0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1dbf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1dc00 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
1dc10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dc30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
1dc40 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
1dc50 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
1dc60 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1dc70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1dc80 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
1dc90 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1dca0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1dcb0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1dcc0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1dcd0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1dce0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1dcf0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1dd00 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1dd10 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1dd20 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1dd30 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1dd40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1dd50 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1dd60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1dd70 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1dd80 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1dd90 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1dda0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1ddb0 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1ddc0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1ddd0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1dde0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1ddf0 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1de00 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1de10 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1de20 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1de30 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1de40 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1de50 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1de60 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1de70 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1de80 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1de90 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1dea0 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1deb0 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1dec0 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1ded0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1dee0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1def0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1df00 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1df10 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1df20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1df30 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1df40 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1df50 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1df60 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1df70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1df80 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1df90 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1dfa0 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1dfb0 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
1dfc0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1dfd0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1dfe0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1dff0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1e000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e010 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1e020 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1e030 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1e040 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1e050 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1e060 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1e070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e080 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1e090 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
1e0a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1e0b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1e0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1e0d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1e0e0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
1e0f0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1e100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e110 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
1e120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
1e140 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
1e150 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1e160 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
1e170 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
1e180 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
1e190 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
1e1a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1e1b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
1e1c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e1d0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1e1e0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
1e1f0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
1e200 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
1e210 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
1e220 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
1e230 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
1e240 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
1e250 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1e260 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
1e270 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
1e280 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1e290 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
1e2a0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
1e2b0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1e2c0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
1e2d0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
1e2e0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
1e2f0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
1e300 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
1e310 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1e320 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
1e330 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
1e340 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
1e350 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
1e360 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1e370 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
1e380 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1e390 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
1e3a0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
1e3b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
1e3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
1e3d0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
1e3e0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
1e3f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1e400 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
1e410 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e430 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
1e440 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
1e450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e460 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1e470 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
1e480 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
1e490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
1e4a0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
1e4b0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
1e4c0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
1e4d0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
1e4e0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
1e4f0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
1e500 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
1e510 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
1e520 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
1e530 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
1e540 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1e550 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1e560 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
1e570 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1e580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1e5b0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
1e5c0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
1e5d0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
1e5e0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
1e5f0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
1e600 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
1e610 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
1e620 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
1e630 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e640 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e650 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e660 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
1e670 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
1e680 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
1e690 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
1e6a0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
1e6b0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1e6c0 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
1e6d0 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
1e6e0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
1e6f0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
1e700 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
1e710 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
1e720 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
1e730 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
1e740 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
1e750 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
1e760 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
1e770 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
1e780 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1e790 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
1e7a0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
1e7b0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
1e7c0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
1e7d0 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
1e7e0 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
1e7f0 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
1e800 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
1e810 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
1e820 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
1e830 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
1e840 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
1e850 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
1e860 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
1e870 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
1e880 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
1e890 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
1e8a0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1e8b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1e8c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
1e8d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
1e8e0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
1e8f0 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
1e900 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1e910 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
1e920 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
1e930 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
1e940 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
1e950 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
1e960 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
1e970 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
1e980 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
1e990 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
1e9a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1e9b0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
1e9c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
1e9d0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
1e9e0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
1e9f0 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
1ea00 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
1ea10 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
1ea20 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
1ea30 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
1ea40 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
1ea50 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
1ea60 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
1ea70 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
1ea80 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
1ea90 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1eaa0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
1eab0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
1eac0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
1ead0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
1eae0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
1eaf0 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
1eb00 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
1eb10 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
1eb20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
1eb30 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
1eb40 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
1eb50 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1eb60 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1eb70 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1eb80 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1eb90 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
1eba0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
1ebb0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
1ebc0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
1ebd0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
1ebe0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
1ebf0 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
1ec00 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
1ec10 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
1ec20 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
1ec30 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
1ec40 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
1ec50 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
1ec60 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
1ec70 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
1ec80 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
1ec90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
1eca0 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
1ecb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ecc0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
1ecd0 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
1ece0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1ecf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ed00 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
1ed10 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
1ed20 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
1ed30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
1ed40 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
1ed50 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
1ed60 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
1ed70 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
1ed80 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
1ed90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1eda0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1edb0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1edc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1edd0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
1ede0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
1edf0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ee00 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
1ee10 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1ee20 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1ee30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1ee40 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
1ee50 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
1ee60 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
1ee70 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
1ee80 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
1ee90 69 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74  if( NEVER(offset
1eea0 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72  +amt > nKey+pCur
1eeb0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20  ->info.nData) . 
1eec0 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1eed0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1eee0 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1eef0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1ef00 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1ef10 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1ef20 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1ef30 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1ef40 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1ef50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ef60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1ef70 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1ef80 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1ef90 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1efa0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1efb0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1efc0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1efd0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1efe0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1eff0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1f000 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1f010 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1f020 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1f030 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1f040 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1f050 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1f060 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1f070 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1f080 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1f090 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1f0a0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1f0b0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1f0c0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1f0d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1f0e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1f0f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1f100 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1f110 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1f120 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1f130 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1f140 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1f150 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1f160 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1f170 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1f180 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1f190 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1f1a0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f1b0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1f1c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1f1d0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1f1e0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1f1f0 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1f200 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1f210 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1f220 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1f230 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1f240 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1f250 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1f260 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1f270 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1f280 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1f290 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1f2a0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1f2b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1f2c0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1f2d0 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1f2e0 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1f2f0 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1f300 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1f310 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1f320 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1f330 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1f340 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1f350 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1f360 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1f370 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1f380 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1f390 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1f3a0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1f3b0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1f3c0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1f3d0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1f3e0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1f3f0 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1f400 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1f410 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1f420 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61     /* nOvfl is a
1f430 6c 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20  lways positive. 
1f440 20 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f   If it were zero
1f450 2c 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77  , fetchPayload w
1f460 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20  ould have.      
1f470 2a 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73  ** been used ins
1f480 74 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75  tead of this rou
1f490 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  tine. */.      i
1f4a0 66 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29  f( ALWAYS(nOvfl)
1f4b0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1f4c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
1f4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1f4e0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
1f4f0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1f500 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f510 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1f520 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
1f530 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
1f540 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
1f550 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
1f560 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
1f570 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
1f580 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
1f590 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
1f5a0 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
1f5b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
1f5c0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
1f5d0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
1f5e0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
1f5f0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
1f600 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
1f610 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
1f620 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
1f630 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
1f640 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
1f650 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
1f660 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
1f670 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
1f680 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
1f690 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1f6a0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
1f6b0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
1f6c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f6d0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
1f6e0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1f6f0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
1f700 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
1f710 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1f720 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
1f730 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
1f740 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1f750 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1f760 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
1f770 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1f780 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
1f790 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
1f7a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
1f7b0 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
1f7c0 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
1f7d0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
1f7e0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
1f7f0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
1f800 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
1f810 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1f820 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
1f830 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
1f840 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
1f850 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
1f860 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
1f870 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
1f880 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
1f890 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
1f8a0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
1f8b0 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
1f8c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
1f8d0 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
1f8e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
1f8f0 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
1f900 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f910 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
1f920 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
1f930 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
1f940 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
1f950 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
1f960 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
1f970 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
1f980 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
1f990 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
1f9a0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
1f9b0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
1f9c0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
1f9d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f9e0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
1f9f0 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
1fa00 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
1fa10 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
1fa20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
1fa30 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
1fa40 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
1fa50 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
1fa60 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
1fa70 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
1fa80 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
1fa90 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1faa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1fab0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
1fac0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
1fad0 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
1fae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1faf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fb00 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
1fb10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1fb20 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
1fb30 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
1fb40 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
1fb50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
1fb60 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
1fb70 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
1fb90 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
1fba0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1fbb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
1fbc0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
1fbd0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
1fbe0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
1fbf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1fc00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1fc10 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
1fc20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
1fc30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
1fc40 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
1fc50 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
1fc60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fc70 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
1fc80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fc90 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
1fca0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1fcb0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1fcc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1fcd0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
1fce0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
1fcf0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1fd00 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1fd10 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1fd20 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1fd30 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1fd40 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1fd50 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1fd60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1fd70 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74  er must ensure t
1fd80 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e  hat pCur is poin
1fd90 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20  ting to a valid 
1fda0 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61  row.** in the ta
1fdb0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ble..**.** Retur
1fdc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1fdd0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1fde0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1fdf0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1fe00 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1fe10 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1fe20 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1fe30 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1fe40 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1fe50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fe60 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
1fe70 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
1fe80 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
1fe90 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
1fea0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1feb0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1fec0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1fed0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1fee0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1fef0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1ff00 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1ff10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1ff20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ff30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ff40 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1ff50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1ff60 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ell );.  return 
1ff70 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1ff80 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1ff90 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1ffa0 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  )pBuf, 0);.}../*
1ffb0 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
1ffc0 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69   the data associ
1ffd0 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
1ffe0 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
1fff0 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
20000 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65  ill be transfere
20010 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
20020 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
20030 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
20040 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  t"..**.** Return
20050 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
20060 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
20070 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
20080 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
20090 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
200a0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
200b0 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
200c0 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
200d0 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
200e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
200f0 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f  treeData(BtCurso
20100 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
20110 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
20120 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
20130 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51   rc;..#ifndef SQ
20140 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20150 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e  OB.  if ( pCur->
20160 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
20170 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  NVALID ){.    re
20180 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
20190 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  T;.  }.#endif.. 
201a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
201b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
201c0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
201d0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
201e0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
201f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20200 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20210 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20220 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
20230 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
20240 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
20250 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
20260 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20270 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20280 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
20290 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
202a0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
202b0 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f  rc = accessPaylo
202c0 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
202d0 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
202e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
202f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20300 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
20310 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
20320 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79  n from the entry
20330 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43   that the .** pC
20340 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  ur cursor is poi
20350 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70  nting to.  The p
20360 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65  ointer is to the
20370 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a   beginning of.**
20380 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70   the key if skip
20390 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f  Key==0 and it po
203a0 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69  ints to the begi
203b0 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66  nning of data if
203c0 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20  .** skipKey==1. 
203d0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
203e0 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
203f0 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  e key/data is wr
20400 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
20410 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
20420 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
20430 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  e returned will 
20440 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69  not be.** a vali
20450 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
20460 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
20470 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
20480 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
20490 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
204a0 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
204b0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
204c0 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
204d0 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
204e0 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
204f0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
20500 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
20510 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
20520 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
20530 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
20540 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
20550 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
20560 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
20570 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
20580 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
20590 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
205a0 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
205b0 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
205c0 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
205d0 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
205e0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
205f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
20600 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
20610 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
20620 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
20630 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
20640 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
20650 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
20660 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
20670 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
20680 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
20690 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
206a0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
206b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
206c0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
206d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
206e0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
206f0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
20700 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
20710 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20  .  int *pAmt,   
20720 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
20740 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
20750 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69  ere */.  int ski
20760 70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a  pKey          /*
20770 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20   read beginning 
20780 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
20790 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  is true */.){.  
207a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
207b0 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61  Payload;.  MemPa
207c0 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32  ge *pPage;.  u32
207d0 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f   nKey;.  u32 nLo
207e0 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  cal;..  assert( 
207f0 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d  pCur!=0 && pCur-
20800 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
20810 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20820 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72  iPage]);.  asser
20830 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20840 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20850 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20860 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20870 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ) );.  pPage = p
20880 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20890 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
208a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
208b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
208c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  ge->nCell );.  i
208d0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69  f( NEVER(pCur->i
208e0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b  nfo.nSize==0) ){
208f0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
20900 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
20910 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70  [pCur->iPage], p
20920 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20930 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20  >iPage],.       
20940 20 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75              &pCu
20950 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20  r->info);.  }.  
20960 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
20970 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61  >info.pCell;.  a
20980 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d  Payload += pCur-
20990 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20  >info.nHeader;. 
209a0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
209b0 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  ey ){.    nKey =
209c0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
209d0 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75   nKey = (int)pCu
209e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
209f0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
20a00 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
20a10 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
20a20 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
20a30 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
20a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
20a50 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
20a60 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73  .nLocal;.    ass
20a70 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65  ert( nLocal<=nKe
20a80 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74  y );.  }.  *pAmt
20a90 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
20aa0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
20ab0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
20ac0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
20ad0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
20ae0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
20af0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
20b00 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
20b10 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
20b20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
20b30 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
20b40 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
20b50 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
20b60 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
20b70 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
20b80 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
20b90 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
20ba0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
20bb0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
20bc0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
20bd0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
20be0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
20bf0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
20c00 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
20c10 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
20c20 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
20c30 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
20c40 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
20c50 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
20c60 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
20c70 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
20c80 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
20c90 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
20ca0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
20cb0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
20cc0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
20cd0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
20ce0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
20cf0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
20d00 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
20d10 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
20d20 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
20d30 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
20d40 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  p = 0;.  assert(
20d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20d60 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
20d70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
20d80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20d90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20da0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
20db0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
20dc0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a  URSOR_VALID) ){.
20dd0 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76      p = (const v
20de0 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
20df0 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
20e00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
20e10 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
20e20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
20e30 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
20e40 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
20e50 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  {.  const void *
20e60 70 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  p = 0;.  assert(
20e70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
20e80 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
20e90 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
20ea0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20eb0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20ec0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
20ed0 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43  (pCur->eState==C
20ee0 55 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a  URSOR_VALID) ){.
20ef0 20 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76      p = (const v
20f00 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
20f10 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
20f20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
20f30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
20f40 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
20f50 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
20f60 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
20f70 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
20f80 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
20f90 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
20fa0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
20fb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
20fc0 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
20fd0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
20fe0 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
20ff0 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
21000 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
21010 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
21020 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
21030 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
21040 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
21050 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
21060 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
21070 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
21080 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
21090 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
210a0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
210b0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
210c0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
210d0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
210e0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
210f0 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
21100 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
21110 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
21120 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
21130 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21140 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21150 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21160 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21170 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
21180 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
21190 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
211a0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
211b0 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
211c0 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
211d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
211e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
211f0 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
21200 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
21210 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29  Pgno, &pNewPage)
21220 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
21230 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
21240 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
21250 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
21260 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
21270 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
21280 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
21290 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
212a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
212b0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
212c0 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77  >nCell<1 || pNew
212d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  Page->intKey!=pC
212e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69  ur->apPage[i]->i
212f0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
21300 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21310 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
21320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21330 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
21340 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
21350 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
21360 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
21370 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
21380 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
21390 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
213a0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
213b0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
213c0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
213d0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
213e0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
213f0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
21400 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
21410 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
21420 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
21430 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
21440 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
21450 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
21460 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
21470 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
21480 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
21490 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
214a0 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
214b0 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
214c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
214d0 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
214e0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
214f0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
21500 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
21510 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
21520 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
21530 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
21540 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
21550 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
21560 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
21570 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
21580 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
21590 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
215a0 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
215b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
215c0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
215d0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
215e0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
215f0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
21600 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
21610 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
21620 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
21630 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
21640 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
21650 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
21660 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
21670 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
21680 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
21690 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
216a0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
216b0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
216c0 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
216d0 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
216e0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
216f0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21700 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21710 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21720 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21730 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21740 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
21750 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21760 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
21770 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
21780 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
21790 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
217a0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
217b0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
217c0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
217d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
217e0 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
217f0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   );.  releasePag
21800 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
21810 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
21820 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
21830 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
21840 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
21850 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a  alidNKey = 0;.}.
21860 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
21870 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
21880 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
21890 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
218a0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
218b0 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
218c0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
218d0 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
218e0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
218f0 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
21900 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
21910 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
21920 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
21930 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
21940 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
21950 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
21960 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
21970 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
21980 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
21990 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
219a0 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
219b0 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
219c0 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
219d0 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
219e0 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
219f0 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
21a00 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
21a10 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
21a20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
21a30 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
21a40 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
21a50 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
21a60 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
21a70 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
21a80 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
21a90 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
21aa0 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
21ab0 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
21ac0 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
21ad0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
21ae0 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
21af0 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
21b00 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
21b10 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
21b20 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
21b30 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
21b40 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
21b50 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
21b60 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
21b70 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
21b80 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
21b90 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
21ba0 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
21bb0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
21bc0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
21bd0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
21be0 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
21bf0 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
21c00 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
21c10 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
21c20 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
21c30 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
21c40 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
21c50 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
21c60 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
21c70 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
21c80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
21c90 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
21ca0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
21cb0 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
21cc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21cd0 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
21ce0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
21cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21d00 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
21d10 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21d20 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21d30 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
21d40 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
21d50 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
21d60 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
21d70 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
21d80 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
21d90 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
21da0 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
21db0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
21dc0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
21dd0 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
21de0 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
21df0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
21e00 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
21e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21e20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d  pCur->skipNext!=
21e30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
21e40 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
21e50 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  skipNext;.    }.
21e60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21e70 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
21e80 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43  );.  }..  if( pC
21e90 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
21ea0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
21eb0 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d  or(i=1; i<=pCur-
21ec0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
21ed0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21ee0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
21ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
21f00 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  ->iPage = 0;.  }
21f10 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67  else{.    rc = g
21f20 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
21f30 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
21f40 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
21f50 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [0]);.    if( rc
21f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21f70 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
21f80 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
21f90 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
21fa0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
21fb0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
21fc0 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  .    /* If pCur-
21fd0 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
21fe0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
21ff0 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
22000 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
22010 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74     ** expected t
22020 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20  o open it on an 
22030 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74  index b-tree. Ot
22040 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79  herwise, if pKey
22050 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e  Info is.    ** N
22060 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
22070 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
22080 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
22090 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
220a0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  .    ** return a
220b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
220c0 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20   error.  */.    
220d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
220e0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
220f0 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =1 || pCur->apPa
22100 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30  ge[0]->intKey==0
22110 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75   );.    if( (pCu
22120 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
22130 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  =pCur->apPage[0]
22140 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22160 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22170 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73    }.  }..  /* As
22180 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f  sert that the ro
22190 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68  ot page is of th
221a0 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20  e correct type. 
221b0 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65  This must be the
221c0 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68  .  ** case as th
221d0 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66  e call to this f
221e0 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61  unction that loa
221f0 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  ded the root-pag
22200 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74  e (either.  ** t
22210 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72  his call or a pr
22220 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f  evious invocatio
22230 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  n) would have de
22240 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
22250 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61  n .  ** if the a
22260 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e  ssumption were n
22270 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20  ot true, and it 
22280 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
22290 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20  for the flags . 
222a0 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65   ** byte to have
222b0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77   been modified w
222c0 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72  hile this cursor
222d0 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
222e0 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20  ference.  ** to 
222f0 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  the page.  */.  
22300 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
22310 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
22320 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
22330 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
22340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
22350 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43  t->isInit && (pC
22360 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
22370 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  ==pRoot->intKey 
22380 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  );..  pCur->aiId
22390 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
223a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
223b0 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  ;.  pCur->atLast
223c0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
223d0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20  lidNKey = 0;..  
223e0 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
223f0 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c  ==0 && !pRoot->l
22400 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
22410 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
22420 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
22430 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
22440 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
22450 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
22460 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
22470 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
22480 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
22490 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
224a0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
224b0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
224c0 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
224d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
224e0 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f  ->eState = ((pRo
224f0 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52  ot->nCell>0)?CUR
22500 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52  SOR_VALID:CURSOR
22510 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20  _INVALID);.  }. 
22520 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22530 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
22540 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
22550 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
22560 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
22570 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
22580 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
22590 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
225a0 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
225b0 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
225c0 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
225d0 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
225e0 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
225f0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
22600 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
22610 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
22620 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
22630 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
22640 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
22650 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
22660 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
22670 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
22680 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22690 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
226a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
226b0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
226c0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
226d0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
226e0 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
226f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22700 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22710 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
22720 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
22730 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
22740 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
22750 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22760 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d  age]));.    rc =
22770 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
22780 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
22790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
227a0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
227b0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
227c0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
227d0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
227e0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
227f0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
22800 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
22810 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
22820 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
22830 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
22840 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
22850 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
22860 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
22870 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
22880 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
22890 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
228a0 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
228b0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
228c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
228d0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
228e0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
228f0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
22900 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
22910 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
22920 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
22930 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
22940 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
22950 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
22960 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
22970 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
22980 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
22990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
229a0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
229b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
229c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
229d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
229e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
229f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
22a00 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22a10 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
22a20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22a30 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
22a40 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
22a50 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
22a60 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
22a70 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
22a80 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
22a90 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
22aa0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
22ab0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
22ac0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
22ad0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22ae0 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  OK ){.    pCur->
22af0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22b00 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
22b10 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l-1;.    pCur->i
22b20 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
22b30 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
22b40 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ey = 0;.  }.  re
22b50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
22b60 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
22b70 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
22b80 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
22b90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22ba0 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
22bb0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
22bc0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
22bd0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
22be0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
22bf0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
22c00 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
22c10 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
22c20 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
22c30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22c40 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
22c50 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
22c60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22c70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22c80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
22c90 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
22ca0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
22cb0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
22cc0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
22cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22ce0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
22cf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
22d00 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
22d10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22d20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22d30 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
22d40 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
22d50 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
22d60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22d70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
22d80 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
22d90 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
22da0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
22db0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
22dc0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
22dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22de0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
22df0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
22e00 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
22e10 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
22e20 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
22e30 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
22e40 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
22e50 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
22e60 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
22e70 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
22e80 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
22e90 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
22ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
22eb0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
22ec0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
22ed0 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
22ee0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22ef0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22f00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
22f10 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
22f20 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
22f30 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  x) );..  /* If t
22f40 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64  he cursor alread
22f50 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
22f60 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73  last entry, this
22f70 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a   is a no-op. */.
22f80 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c    if( CURSOR_VAL
22f90 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
22fa0 20 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74   && pCur->atLast
22fb0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
22fc0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54  E_DEBUG.    /* T
22fd0 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73  his block serves
22fe0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
22ff0 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61  t the cursor rea
23000 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a  lly does point .
23010 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61      ** to the la
23020 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
23030 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69  b-tree. */.    i
23040 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69  nt ii;.    for(i
23050 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50  i=0; ii<pCur->iP
23060 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
23070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23080 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d  aiIdx[ii]==pCur-
23090 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65  >apPage[ii]->nCe
230a0 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ll );.    }.    
230b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
230c0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
230d0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ==pCur->apPage[p
230e0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
230f0 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  ll-1 );.    asse
23100 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23110 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c  [pCur->iPage]->l
23120 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
23130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23140 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
23150 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
23160 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
23180 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
23190 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
231a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
231b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
231c0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
231d0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
231e0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
231f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23200 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23210 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23220 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
23230 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23240 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
23250 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
23260 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
23270 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
23280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23290 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
232a0 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
232b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
232c0 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
232d0 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
232e0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
232f0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
23300 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
23310 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
23320 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
23330 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
23340 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
23350 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
23360 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
23370 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
23380 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
23390 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
233a0 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
233b0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
233c0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
233d0 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
233e0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
233f0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
23400 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
23410 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
23420 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
23430 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
23440 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
23450 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
23460 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
23470 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
23480 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
23490 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
234a0 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
234b0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
234c0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
234d0 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
234e0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
234f0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
23500 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
23510 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
23520 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
23530 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
23540 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
23550 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
23560 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
23570 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
23580 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
23590 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
235a0 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
235b0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
235c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
235d0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
235e0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
235f0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
23600 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
23610 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
23620 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
23630 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
23640 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
23650 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
23680 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
23690 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
236a0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
236b0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
236c0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
236d0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
236e0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
236f0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
23700 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
23710 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
23720 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
23730 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
23740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
23750 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
23760 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
23770 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
23780 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
23790 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
237a0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
237b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
237c0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
237d0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
237e0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
237f0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
23800 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
23810 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23830 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
23840 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
23850 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
23860 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23870 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23880 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23890 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
238a0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
238b0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
238c0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
238d0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
238e0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
238f0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
23900 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
23910 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
23920 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
23930 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
23940 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
23950 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
23960 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
23970 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
23980 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23990 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
239a0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
239b0 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
239c0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
239d0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
239e0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
239f0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
23a00 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
23a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23a20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
23a30 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
23a40 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
23a50 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
23a60 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
23a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23a80 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
23a90 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
23aa0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
23ab0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
23ac0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23ad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23ae0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
23af0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23b00 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23b10 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
23b20 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
23b30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23b40 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72  >nCell>0 || pCur
23b50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23b60 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66  _INVALID );.  if
23b70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23b80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
23b90 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
23ba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
23bb0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23bc0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
23bd0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
23be0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23bf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23c00 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
23c10 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
23c20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
23c30 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20  t lwr, upr;.    
23c40 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
23c50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
23c60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
23c70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
23c80 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
23c90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
23ca0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
23cb0 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
23cc0 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
23cd0 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
23ce0 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
23cf0 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
23d00 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
23d10 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
23d20 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
23d30 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
23d40 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
23d50 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
23d60 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
23d70 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
23d80 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
23d90 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
23da0 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
23db0 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
23dc0 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
23dd0 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
23de0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
23df0 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
23e00 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
23e10 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
23e20 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
23e30 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
23e40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23e50 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
23e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23e70 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
23e80 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
23e90 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
23ea0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
23eb0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
23ec0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
23ed0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23ee0 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a  ge] = (u16)upr;.
23ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23f00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23f10 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
23f20 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  )((upr+lwr)/2);.
23f30 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
23f40 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
23f50 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
23f60 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
23f70 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
23f80 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
23f90 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  /.      u8 *pCel
23fa0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
23fc0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
23fd0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
23fe0 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  */..      pCur->
23ff0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24000 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
24010 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
24020 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
24030 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
24040 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24050 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
24060 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
24070 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
24080 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
24090 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
240a0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
240b0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
240c0 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
240d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
240e0 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
240f0 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
24100 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
24110 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
24120 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
24130 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
24140 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
24150 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
24160 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
24170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24180 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
24190 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
241a0 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
241b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
241c0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
241d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
241e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
241f0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
24200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
24210 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
24220 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
24230 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73  e is 65536 bytes
24240 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
24250 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
24260 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
24270 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
24280 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
24290 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
242a0 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73    ** page is les
242b0 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74  s than 16384 byt
242c0 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74  es and may be st
242d0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
242e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
242f0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
24300 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
24310 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
24320 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
24330 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
24340 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
24350 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
24360 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
24370 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
24380 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
24390 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
243a0 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
243b0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
243c0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
243d0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
243e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
243f0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
24400 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
24410 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
24420 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50  80) && nCell<=pP
24430 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
24440 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
24450 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
24460 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
24470 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
24480 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
24490 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
244a0 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
244b0 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
244c0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
244d0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
244e0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
244f0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
24500 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
24510 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
24520 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
24530 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
24540 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
24550 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
24560 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
24570 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
24580 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
24590 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
245a0 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
245b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
245c0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
245d0 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
245e0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
245f0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
24600 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
24610 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
24620 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
24630 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
24640 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
24650 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
24660 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
24670 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
24680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24690 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
246a0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
246b0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
246c0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
246d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
246e0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
246f0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
24700 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
24710 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
24720 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
24730 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
24740 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
24750 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
24760 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
24770 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
24780 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
24790 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
247a0 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
247b0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
247c0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
247d0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
247e0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
247f0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
24800 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
24810 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
24820 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
24830 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
24840 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
24850 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
24860 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
24870 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
24880 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
24890 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
248a0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
248b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
248c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
248d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
248e0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
248f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
24900 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
24910 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
24920 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
24930 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
24940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
24950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
24960 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
24970 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
24980 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
24990 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
249a0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
249b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
249c0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
249d0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
249e0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
249f0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
24a00 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
24a10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24a20 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
24a30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
24a40 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
24a50 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
24a60 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
24a70 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20        upr = lwr 
24a80 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  - 1;.          b
24a90 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
24aa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
24ab0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
24ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24ad0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
24ae0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
24af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24b00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
24b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
24b20 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
24b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
24b40 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
24b50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
24b60 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
24b70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
24b80 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
24b90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
24ba0 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29   (u16)((lwr+upr)
24bb0 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  /2);.    }.    a
24bc0 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
24bd0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
24be0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
24bf0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
24c00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
24c10 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
24c20 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
24c30 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
24c40 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
24c50 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24c60 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24c70 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
24c80 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
24c90 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
24ca0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
24cb0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
24cc0 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
24cd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24ce0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24cf0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
24d00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24d10 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
24d20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
24d30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24d40 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
24d50 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
24d60 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
24d70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
24d80 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43  (u16)lwr;.    pC
24d90 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
24da0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
24db0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
24dc0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
24dd0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
24de0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
24df0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
24e00 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
24e10 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ish:.  return rc
24e20 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
24e30 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
24e40 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
24e50 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
24e60 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
24e70 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
24e80 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
24e90 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
24ea0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
24eb0 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
24ec0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
24ed0 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
24ee0 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
24ef0 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
24f00 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
24f10 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
24f20 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
24f30 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
24f40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
24f50 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
24f60 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
24f70 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
24f80 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
24f90 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
24fa0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
24fb0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
24fc0 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
24fd0 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
24fe0 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
24ff0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
25000 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
25010 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
25020 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
25030 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
25040 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
25050 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
25060 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
25070 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
25080 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
25090 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
250a0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
250b0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
250c0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
250d0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
250e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
250f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25100 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
25110 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
25120 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
25130 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
25140 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
25150 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
25160 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
25170 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
25180 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
25190 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
251a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
251b0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
251c0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
251d0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
251e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
251f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25200 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
25210 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55  s!=0 );.  if( CU
25220 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
25230 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
25240 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
25250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25260 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
25270 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
25280 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
25290 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  ext = 0;.    *pR
252a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
252b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
252c0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  }.  pCur->skipNe
252d0 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  xt = 0;..  pPage
252e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
252f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
25300 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
25310 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25330 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
25340 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67  ssert( idx<=pPag
25350 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70  e->nCell );..  p
25360 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
25370 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
25380 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
25390 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
253a0 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
253b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
253c0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
253d0 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
253e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
253f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
25400 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
25410 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
25420 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d  rc;.      rc = m
25430 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
25440 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  ur);.      *pRes
25450 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
25460 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
25470 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
25480 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
25490 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
254a0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
254b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
254c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
254d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
254e0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
254f0 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
25500 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61  pCur);.      pPa
25510 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
25520 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
25530 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72      }while( pCur
25540 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25550 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65  age]>=pPage->nCe
25560 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20  ll );.    *pRes 
25570 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
25580 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
25590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
255a0 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
255b0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
255c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
255d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
255e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
255f0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
25600 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
25610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
25620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
25630 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
25640 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  st(pCur);.  retu
25650 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
25660 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
25670 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
25680 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
25690 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
256a0 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
256b0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
256c0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
256d0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
256e0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
256f0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
25700 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
25710 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
25720 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
25730 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
25740 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
25750 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
25760 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
25770 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
25780 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
25790 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
257a0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
257b0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
257c0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
257d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
257e0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
257f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25800 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25810 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
25820 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
25830 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
25840 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
25850 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
25860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
25870 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
25880 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70  pNext<0 ){.    p
25890 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
258a0 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
258b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
258c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
258d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
258e0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
258f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25900 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
25910 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
25920 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
25930 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
25940 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
25950 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
25960 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
25970 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
25980 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
25990 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
259a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
259b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
259c0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  }.    rc = moveT
259d0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
259e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
259f0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
25a00 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
25a10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
25a20 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
25a30 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
25a40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
25a50 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
25a60 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
25a70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25a80 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
25a90 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28     moveToParent(
25aa0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
25ab0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
25ac0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
25ad0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
25ae0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
25af0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
25b00 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75  .    pPage = pCu
25b10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25b20 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20  iPage];.    if( 
25b30 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
25b40 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
25b50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25b60 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
25b70 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
25b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25b90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
25ba0 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73     }.  }.  *pRes
25bb0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
25bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
25bd0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
25be0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
25bf0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
25c00 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
25c10 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
25c20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
25c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25c40 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
25c50 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
25c60 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
25c70 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
25c80 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
25c90 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
25ca0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
25cb0 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
25cc0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
25cd0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
25ce0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
25cf0 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
25d00 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
25d10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
25d20 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
25d30 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
25d40 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
25d50 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
25d60 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e  ppPage and *pPgn
25d70 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  o are undefined 
25d80 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
25d90 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20  an error..** Do 
25da0 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74  not invoke sqlit
25db0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
25dc0 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20  n *ppPage if an 
25dd0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
25de0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
25df0 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
25e00 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
25e10 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66  n a (feeble) eff
25e20 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a  ort is made to .
25e30 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  ** locate a page
25e40 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61   close to the pa
25e50 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62  ge number "nearb
25e60 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  y".  This can be
25e70 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61   used in an.** a
25e80 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72  ttempt to keep r
25e90 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f  elated pages clo
25ea0 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72  se to each other
25eb0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25ec0 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20   file,.** which 
25ed0 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65  in turn can make
25ee0 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
25ef0 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   faster..**.** I
25f00 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61  f the "exact" pa
25f10 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
25f20 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e  , and the page-n
25f30 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69  umber nearby exi
25f40 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65  sts .** anywhere
25f50 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
25f60 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75  t, then it is gu
25f70 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72  arenteed to be r
25f80 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
25f90 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
25fa0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
25fb0 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f  abases when allo
25fc0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  cating a new tab
25fd0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
25fe0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
25ff0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
26000 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65  *pBt, .  MemPage
26010 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67   **ppPage, .  Pg
26020 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67  no *pPgno, .  Pg
26030 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20  no nearby,.  u8 
26040 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61  exact.){.  MemPa
26050 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
26060 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20  t rc;.  u32 n;  
26070 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26080 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
26090 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b  elist */.  u32 k
260a0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
260b0 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65  of leaves on the
260c0 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72   trunk of the fr
260d0 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50  eelist */.  MemP
260e0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
260f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65  .  MemPage *pPre
26100 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67  vTrunk = 0;.  Pg
26110 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f  no mxPage;     /
26120 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20  * Total size of 
26130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26140 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
26150 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
26160 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
26170 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
26180 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
26190 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
261a0 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20  unt(pBt);.  n = 
261b0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
261c0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
261d0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50  testcase( n==mxP
261e0 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e  age-1 );.  if( n
261f0 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  >=mxPage ){.    
26200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26210 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26220 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
26230 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61   /* There are pa
26240 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
26250 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20  ist.  Reuse one 
26260 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20  of those pages. 
26270 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75  */.    Pgno iTru
26280 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63  nk;.    u8 searc
26290 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66  hList = 0; /* If
262a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d   the free-list m
262b0 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20  ust be searched 
262c0 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a  for 'nearby' */.
262d0 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74      .    /* If t
262e0 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d  he 'exact' param
262f0 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e  eter was true an
26300 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65  d a query of the
26310 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
26320 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74   ** shows that t
26330 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
26340 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e   is somewhere on
26350 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
26360 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  then.    ** the 
26370 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c  entire-list will
26380 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
26390 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20   that page..    
263a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
263b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
263c0 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20  M.    if( exact 
263d0 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  && nearby<=mxPag
263e0 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  e ){.      u8 eT
263f0 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
26400 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
26410 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
26420 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
26430 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
26440 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
26450 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
26460 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
26470 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
26480 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
26490 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
264a0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
264b0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
264c0 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
264d0 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
264e0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
264f0 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
26500 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
26510 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
26520 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
26530 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
26540 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
26550 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
26560 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
26570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26580 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
26590 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
265a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
265b0 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
265c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
265d0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
265e0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
265f0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
26600 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
26610 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
26620 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
26630 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
26640 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
26650 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
26660 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
26670 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
26680 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
26690 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
266a0 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
266b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
266c0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
266d0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
266e0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
266f0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
26700 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
26710 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
26720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26730 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
26740 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26750 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
26760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
26770 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
26780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
26790 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  unk>mxPage ){.  
267a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
267b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
267c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
267d0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
267e0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
267f0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
26800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26810 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26820 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
26830 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
26840 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
26850 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
26860 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
26870 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
26880 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
26890 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
268a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
268b0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
268c0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
268d0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
268e0 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
268f0 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
26900 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
26910 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
26920 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
26930 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
26940 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
26950 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
26960 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
26970 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26980 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
26990 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
269a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
269b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
269c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
269d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
269e0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
269f0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
26a00 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
26a10 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
26a20 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
26a30 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
26a40 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
26a50 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
26a60 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
26a70 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
26a80 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
26a90 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
26aa0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
26ab0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
26ac0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
26ad0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
26ae0 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
26af0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
26b00 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
26b10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
26b20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
26b30 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
26b40 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26b50 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
26b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26b70 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
26b80 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
26b90 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
26ba0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
26bb0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
26bc0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
26bd0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
26be0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
26bf0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
26c00 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
26c10 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
26c20 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
26c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
26c40 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
26c50 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
26c60 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
26c70 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
26c80 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
26c90 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26ca0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
26cb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26cc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
26cd0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
26ce0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
26cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26d00 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
26d10 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
26d20 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
26d30 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
26d40 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
26d50 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26d60 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26d80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26d90 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
26da0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
26db0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26dc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
26de0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
26df0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
26e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
26e10 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
26e20 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
26e30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26e40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26e50 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
26e60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26e70 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
26e80 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
26e90 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
26ea0 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
26eb0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
26ec0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
26ed0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
26ee0 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
26ef0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
26f00 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
26f10 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
26f20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
26f30 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
26f40 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
26f50 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
26f60 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
26f70 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
26f80 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
26f90 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
26fa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26fb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26fc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26fd0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26fe0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26ff0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27000 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
27010 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
27020 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27030 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
27040 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
27050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27070 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
27080 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27090 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
270a0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
270b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
270c0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
270d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
270e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
270f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27100 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
27110 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
27120 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27130 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27150 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
27160 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
27170 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27180 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27190 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
271a0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
271b0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
271c0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
271d0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
271e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
271f0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
27200 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
27210 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
27220 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
27230 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
27240 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27250 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
27260 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
27270 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
27280 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
27290 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
272a0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
272b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
272c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
272d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
272e0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
272f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
27300 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
27310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
27320 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27330 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
27340 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27350 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
27360 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27370 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
27380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27390 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
273a0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
273b0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
273c0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
273d0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
273e0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
273f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
27400 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
27410 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
27420 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
27430 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
27440 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
27450 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
27460 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
27470 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
27480 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
27490 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
274a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
274b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
274c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
274d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
274e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
274f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27500 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
27510 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
27520 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
27530 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
27540 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
27550 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27560 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
27570 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
27580 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
27590 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
275a0 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
275b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
275c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
275d0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
275e0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
275f0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
27600 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
27610 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
27620 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
27630 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
27640 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
27650 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
27660 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
27670 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
276a0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
276b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
276c0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
276d0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
276e0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
276f0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
27700 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
27710 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
27720 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
27730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
27740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27750 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
27760 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
27770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27780 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
27790 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
277a0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
277b0 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
277c0 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
277d0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
277e0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
277f0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
27800 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
27810 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
27820 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
27830 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
27840 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
27850 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
27860 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27870 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
27880 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
27890 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
278a0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
278b0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
278c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
278d0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
278e0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
278f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
27900 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
27910 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
27920 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
27930 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27940 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
27950 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27960 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
27970 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
27980 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
27990 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
279a0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
279b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
279c0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
279d0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
279e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
279f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27a00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27a10 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
27a20 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
27a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27a40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27a60 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
27a70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27a80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
27a90 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
27aa0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
27ab0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27ac0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27ad0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
27ae0 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
27af0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
27b00 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
27b10 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
27b20 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
27b30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
27b40 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
27b50 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
27b60 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
27b70 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
27b80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27b90 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
27ba0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
27bb0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27bc0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
27bd0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
27be0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
27bf0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
27c00 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
27c10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27c20 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27c30 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
27c40 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
27c50 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
27c60 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
27c70 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
27c80 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
27c90 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
27ca0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
27cb0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
27cc0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
27cd0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
27ce0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
27cf0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
27d00 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
27d10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
27d20 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
27d30 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
27d40 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
27d50 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
27d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
27d70 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
27d80 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
27d90 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
27da0 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
27db0 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
27dc0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
27dd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27de0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
27df0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27e00 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
27e10 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  ge, &pPg, 1);.  
27e20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27e30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27e50 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
27e60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
27e70 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
27e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27e90 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27ea0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
27eb0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
27ec0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
27ed0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
27ee0 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
27ef0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
27f00 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
27f10 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
27f20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
27f30 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
27f40 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
27f50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
27f60 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
27f70 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
27f80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
27f90 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
27fa0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
27fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
27fd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27fe0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
27ff0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
28000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28010 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
28020 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
28030 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
28040 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
28050 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
28060 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
28070 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
28080 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
28090 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
280a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
280b0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
280c0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
280d0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
280e0 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
280f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28100 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
28110 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
28120 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
28130 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
28140 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
28150 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28160 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28170 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
28180 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
28190 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
281a0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
281b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
281c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
281d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
281e0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
281f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28200 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
28210 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
28220 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
28230 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
28240 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
28250 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
28260 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
28270 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28280 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
28290 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
282a0 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
282b0 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
282c0 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
282d0 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
282e0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
282f0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
28300 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
28310 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
28320 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
28330 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
28340 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
28350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
28360 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
28370 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
28380 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
28390 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
283a0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
283b0 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
283c0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
283d0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
283e0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
283f0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
28400 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
28410 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
28420 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
28430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28440 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
28450 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
28460 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28480 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
28490 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
284a0 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
284b0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
284c0 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
284d0 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
284e0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
284f0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
28500 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
28510 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
28520 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
28530 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
28540 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
28570 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
28580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
285a0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
285b0 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
285c0 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
285d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
285e0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
285f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
28600 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
28610 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
28620 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
28630 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
28640 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
28650 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
28660 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
28670 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
28680 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
28690 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
286a0 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
286b0 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
286c0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
286d0 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
286e0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
286f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28700 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
28710 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
28720 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
28730 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
28740 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
28750 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
28760 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28770 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
28780 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
28790 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
287a0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
287b0 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
287c0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
287d0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
287e0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
287f0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
28800 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
28810 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
28820 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
28830 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
28840 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
28850 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
28860 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
28870 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
28880 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28890 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
288a0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
288b0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
288c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
288d0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
288e0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
288f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
28900 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
28910 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
28920 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
28930 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
28940 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
28950 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
28960 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
28970 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
28980 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
28990 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
289a0 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
289b0 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
289c0 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
289d0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
289e0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
289f0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
28a00 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
28a10 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
28a20 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
28a30 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
28a40 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
28a50 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
28a60 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
28a70 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
28a80 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
28a90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28aa0 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
28ab0 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
28ac0 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
28ad0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28ae0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
28af0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
28b00 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
28b10 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
28b20 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
28b30 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
28b40 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
28b50 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
28b60 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
28b70 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
28b80 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
28b90 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
28ba0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
28bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28bc0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
28bd0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
28be0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
28bf0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
28c00 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
28c10 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
28c20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28c30 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
28c40 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
28c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
28c70 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28c80 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
28c90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
28ca0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
28cb0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28cc0 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
28cd0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
28ce0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
28cf0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
28d00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28d10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28d20 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
28d30 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
28d40 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
28d50 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
28d60 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
28d70 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
28d80 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
28d90 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
28da0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
28db0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
28dc0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
28dd0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
28de0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
28df0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
28e00 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
28e10 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
28e20 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
28e30 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
28e40 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
28e50 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
28e60 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
28e70 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
28e80 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
28e90 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
28ea0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
28eb0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
28ec0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
28ed0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
28ee0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
28ef0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
28f00 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
28f10 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
28f20 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
28f30 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
28f40 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
28f50 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
28f60 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
28f70 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
28f80 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
28f90 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
28fa0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
28fb0 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
28fc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
28fd0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
28fe0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
28ff0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
29000 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
29010 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
29020 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
29030 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
29040 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
29050 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
29060 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
29070 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
29080 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
29090 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
290a0 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
290b0 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
290c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
290d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
290e0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
290f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
29100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29110 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
29120 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
29130 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
29140 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
29150 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29160 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
29170 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
29180 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
29190 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
291a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
291b0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
291c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
291d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
291e0 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
291f0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
29200 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
29210 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
29220 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
29230 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
29240 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
29250 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
29260 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
29270 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
29280 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
29290 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
292a0 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
292b0 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
292c0 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
292d0 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
292e0 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
292f0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
29300 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
29310 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
29320 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
29330 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
29340 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
29350 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
29360 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
29370 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
29380 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
29390 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
293a0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
293b0 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
293c0 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
293d0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
293e0 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
293f0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
29400 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
29410 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
29420 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
29430 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
29440 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29450 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
29460 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29470 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
29480 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29490 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
294a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
294b0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
294c0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
294d0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
294e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
294f0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
29500 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29510 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
29520 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
29530 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
29540 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
29550 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
29560 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
29570 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
29580 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
29590 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
295a0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
295b0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
295c0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
295d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
295e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
295f0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
29600 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
29610 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
29620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
29630 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
29640 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
29650 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
29660 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
29670 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
29680 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
29690 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
296a0 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
296b0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
296c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
296d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
296e0 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
296f0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
29700 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
29710 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
29720 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
29730 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
29740 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
29750 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29760 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29770 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29780 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
29790 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
297a0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
297b0 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
297c0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
297d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
297e0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
297f0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
29800 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
29810 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
29820 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
29830 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
29840 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
29850 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
29860 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
29870 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
29880 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
29890 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
298a0 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
298b0 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
298c0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
298d0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
298e0 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
298f0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
29900 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
29910 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
29920 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
29930 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
29940 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
29950 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
29960 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
29970 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
29980 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
29990 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
299a0 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
299b0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
299c0 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
299d0 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
299e0 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
299f0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
29a00 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
29a10 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29a20 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
29a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29a40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29a50 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
29a60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
29a70 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
29a80 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
29a90 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
29aa0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29ab0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
29ac0 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
29ad0 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
29ae0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
29af0 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
29b00 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
29b10 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
29b20 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
29b30 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
29b40 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
29b50 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
29b60 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
29b70 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
29b80 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
29b90 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
29ba0 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
29bb0 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
29bc0 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
29bd0 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
29be0 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
29bf0 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
29c00 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
29c10 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
29c20 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
29c30 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
29c40 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29c50 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
29c60 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
29c70 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
29c80 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
29c90 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
29ca0 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
29cb0 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
29cc0 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
29cd0 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
29ce0 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
29cf0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
29d00 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
29d10 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
29d20 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
29d30 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
29d40 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
29d50 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
29d60 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
29d70 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
29d80 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
29d90 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
29da0 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
29db0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
29dc0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29dd0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
29de0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
29df0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
29e00 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
29e10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
29e20 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
29e30 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
29e40 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
29e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
29e60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29e70 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
29e80 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
29e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29ea0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
29eb0 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
29ec0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
29ed0 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
29ee0 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
29ef0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
29f00 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
29f10 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
29f20 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
29f30 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
29f40 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
29f50 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
29f60 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
29f70 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
29f80 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
29f90 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
29fa0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
29fb0 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
29fc0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
29fd0 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
29fe0 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
29ff0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
2a000 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
2a010 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
2a020 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
2a030 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
2a040 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
2a050 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
2a060 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
2a070 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
2a080 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
2a090 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
2a0a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
2a0b0 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
2a0c0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
2a0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a0e0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
2a0f0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
2a100 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2a110 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
2a120 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
2a130 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
2a140 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2a150 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2a160 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
2a170 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
2a180 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
2a190 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
2a1a0 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
2a1d0 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
2a1e0 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
2a1f0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
2a200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2a210 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
2a220 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2a230 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
2a240 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
2a250 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
2a260 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
2a270 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
2a280 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2a290 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
2a2a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2a2b0 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
2a2c0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
2a2d0 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
2a2e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2a2f0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
2a300 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
2a310 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
2a320 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
2a330 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a340 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a350 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2a360 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
2a370 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
2a380 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
2a390 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
2a3a0 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
2a3b0 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
2a3c0 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
2a3d0 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
2a3e0 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
2a3f0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
2a400 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
2a410 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2a420 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2a430 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2a440 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a450 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2a460 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2a470 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
2a480 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
2a490 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2a4a0 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
2a4b0 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
2a4c0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
2a4d0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2a4e0 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2a4f0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
2a500 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
2a510 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
2a520 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
2a530 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2a540 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2a550 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2a560 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
2a570 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2a580 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2a590 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2a5a0 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
2a5b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2a5c0 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
2a5d0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2a5e0 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
2a5f0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
2a600 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2a610 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
2a620 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
2a630 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
2a640 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2a650 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
2a660 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2a670 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
2a680 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
2a690 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
2a6a0 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
2a6b0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
2a6c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a6d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a6e0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
2a6f0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2a700 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2a710 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2a720 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
2a730 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2a740 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
2a750 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
2a760 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2a770 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
2a780 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
2a790 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
2a7a0 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
2a7b0 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
2a7c0 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
2a7d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2a7e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
2a7f0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
2a800 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
2a810 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2a820 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
2a830 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2a840 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a850 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2a860 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
2a870 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
2a880 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
2a890 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2a8a0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
2a8b0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
2a8c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a8d0 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
2a8e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a8f0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2a900 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2a910 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
2a920 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
2a930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a940 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a950 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2a960 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2a970 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
2a980 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
2a990 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
2a9a0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2a9b0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
2a9c0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
2a9d0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
2a9e0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
2a9f0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
2aa00 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
2aa10 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2aa20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2aa30 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
2aa40 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
2aa50 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
2aa60 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2aa70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
2aa80 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
2aa90 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
2aaa0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2aab0 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
2aac0 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
2aad0 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
2aae0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
2aaf0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
2ab00 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
2ab10 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
2ab20 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
2ab30 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
2ab40 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
2ab50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2ab60 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2ab70 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
2ab80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2ab90 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
2aba0 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
2abb0 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
2abc0 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
2abd0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2abe0 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
2abf0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
2ac00 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2ac10 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2ac20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
2ac30 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2ac40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ac50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ac60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ac70 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2ac80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ac90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2aca0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2acb0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2acc0 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
2acd0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2ace0 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
2acf0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2ad00 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2ad10 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2ad20 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
2ad30 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2ad40 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2ad50 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ad60 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2ad70 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
2ad80 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
2ad90 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2ada0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2adb0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2adc0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
2add0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2ade0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2adf0 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
2ae00 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
2ae10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2ae20 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2ae30 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2ae40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ae50 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ae60 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
2ae70 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
2ae80 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
2ae90 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2aea0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
2aeb0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
2aec0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
2aed0 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
2aee0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2aef0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
2af00 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
2af10 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
2af20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
2af30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2af40 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
2af50 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2af60 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
2af70 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
2af80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
2af90 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2afa0 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
2afb0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2afc0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
2afd0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2afe0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2aff0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2b000 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2b010 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2b020 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2b030 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2b040 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2b050 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2b060 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
2b070 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2b080 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2b090 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2b0a0 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
2b0b0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2b0c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2b0d0 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
2b0e0 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
2b0f0 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
2b100 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2b110 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2b120 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b130 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2b140 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
2b150 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
2b160 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
2b170 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
2b180 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
2b190 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2b1a0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
2b1b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b1c0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
2b1d0 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
2b1e0 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
2b1f0 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
2b200 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
2b210 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
2b220 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
2b230 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
2b240 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
2b250 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2b260 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
2b270 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
2b280 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2b290 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
2b2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2b2b0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2b2c0 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
2b2d0 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
2b2e0 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
2b2f0 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
2b300 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
2b310 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
2b320 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
2b330 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
2b340 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2b350 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2b360 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
2b370 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2b380 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
2b390 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2b3a0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
2b3b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
2b3c0 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
2b3d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2b3e0 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
2b3f0 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
2b400 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2b410 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
2b420 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2b430 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2b440 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b450 2f 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  /.  u32 pc;     
2b460 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2b470 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2b480 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2b490 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2b4a0 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2b4b0 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2b4c0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2b4d0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2b4e0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2b4f0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2b500 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2b510 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2b520 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2b530 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2b540 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2b550 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2b560 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2b570 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2b580 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2b590 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2b5a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2b5b0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2b5c0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2b5d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b5e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b5f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2b600 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2b610 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b620 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b630 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2b640 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2b650 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
2b660 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2b670 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
2b680 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2b690 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2b6a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2b6b0 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2b6c0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b6d0 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2b6e0 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2b6f0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2b700 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2b710 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
2b720 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
2b730 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
2b740 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
2b750 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
2b760 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b770 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2b780 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
2b790 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
2b7a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2b7b0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2b7c0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
2b7d0 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
2b7e0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
2b7f0 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
2b800 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
2b810 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2b820 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
2b830 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
2b840 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2b850 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2b860 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2b870 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   += 2;.}../*.** 
2b880 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
2b890 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
2b8a0 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
2b8b0 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
2b8c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
2b8d0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
2b8e0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
2b8f0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
2b900 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
2b910 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
2b920 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
2b930 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
2b940 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
2b950 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
2b960 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
2b970 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
2b980 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
2b990 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
2b9a0 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
2b9b0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
2b9c0 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
2b9d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
2b9e0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
2b9f0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
2ba00 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
2ba10 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
2ba20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
2ba30 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
2ba40 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
2ba50 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
2ba60 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
2ba70 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
2ba80 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
2ba90 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
2baa0 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
2bab0 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
2bac0 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
2bad0 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
2bae0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
2baf0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
2bb00 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
2bb10 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
2bb20 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2bb30 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
2bb40 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
2bb50 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
2bb60 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
2bb70 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
2bb80 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
2bb90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
2bba0 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
2bbb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
2bbc0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
2bbd0 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
2bbe0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
2bbf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
2bc00 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
2bc10 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
2bc20 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
2bc30 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
2bc40 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
2bc50 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
2bc60 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
2bc70 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
2bc80 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
2bc90 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
2bca0 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
2bcb0 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
2bcc0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
2bcd0 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
2bce0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
2bcf0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
2bd00 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
2bd10 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
2bd20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
2bd30 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
2bd40 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
2bd50 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
2bd60 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
2bd70 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
2bd80 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
2bd90 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
2bda0 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
2bdb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2bdc0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2bdd0 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
2bde0 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
2bdf0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
2be00 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2be10 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
2be20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2be30 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
2be40 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
2be50 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
2be60 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
2be70 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
2be80 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
2be90 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2bea0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2beb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2bec0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
2bed0 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
2bee0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
2bef0 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
2bf00 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
2bf10 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
2bf20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20  */..  int nSkip 
2bf30 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2bf40 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2bf50 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2bf60 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2bf70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2bf80 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2bf90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2bfa0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2bfb0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2bfc0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2bfd0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2bfe0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2bff0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2c000 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2c010 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c030 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2c040 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2c050 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2c060 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2c070 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2c080 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2c090 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2c0a0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2c0b0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2c0c0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2c0d0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2c0e0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2c0f0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2c100 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2c110 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2c120 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2c130 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2c140 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2c150 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2c160 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2c170 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2c180 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2c190 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2c1a0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2c1b0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2c1c0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2c1d0 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2c1e0 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2c1f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2c200 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2c210 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2c220 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2c230 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2c240 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2c250 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2c260 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2c270 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2c280 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2c290 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2c2a0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2c2b0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2c2c0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2c2d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2c2e0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2c2f0 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2c300 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2c310 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2c320 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2c330 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2c340 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2c350 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2c360 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2c370 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c380 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c390 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2c3a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c3b0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2c3c0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2c3d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2c3e0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c3f0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2c400 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2c410 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2c420 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2c430 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2c440 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2c450 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2c460 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2c470 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2c480 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2c490 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2c4a0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2c4b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2c4c0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2c4d0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2c4e0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2c4f0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2c500 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2c510 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2c520 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2c530 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2c540 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2c550 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2c560 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2c570 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
2c580 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
2c590 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
2c5a0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
2c5b0 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
2c5c0 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
2c5d0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
2c5e0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2c5f0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28  -nSkip);.    if(
2c600 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2c610 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
2c620 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
2c630 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65     }.    for(j=e
2c640 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  nd, ptr=&data[j]
2c650 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
2c660 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
2c670 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
2c680 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
2c690 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
2c6a0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2c6b0 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
2c6c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2c6d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2c6e0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2c6f0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2c700 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c710 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2c720 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2c730 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2c740 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2c750 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2c760 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2c770 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2c780 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2c790 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2c7a0 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2c7b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2c7c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
2c7d0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
2c7e0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
2c7f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2c800 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2c810 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
2c820 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
2c830 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
2c840 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
2c850 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
2c860 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
2c870 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
2c880 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2c890 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
2c8a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2c8b0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2c8c0 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
2c8d0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
2c8e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2c8f0 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
2c900 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
2c910 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2c920 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2c930 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
2c940 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
2c950 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
2c960 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
2c970 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
2c980 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c990 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
2c9a0 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
2c9b0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2c9c0 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
2c9d0 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
2c9e0 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
2c9f0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
2ca00 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
2ca10 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
2ca20 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
2ca30 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2ca40 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
2ca50 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2ca60 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2ca70 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
2ca80 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2ca90 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
2caa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
2cab0 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
2cac0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2cad0 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2cae0 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
2caf0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2cb00 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
2cb10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2cb20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2cb30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2cb40 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
2cb50 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
2cb60 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2cb70 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2cb80 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b  e->pBt)<=10921);
2cb90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2cba0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2cbb0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2cbc0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  e) );..  /* Chec
2cbd0 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2cbe0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65  has just been ze
2cbf0 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65  roed by zeroPage
2cc00 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  () */.  assert( 
2cc10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2cc20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2cc30 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
2cc40 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2cc50 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2cc60 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2cc70 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2cc80 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2cc90 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2cca0 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2ccb0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2ccc0 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2ccd0 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
2cce0 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
2ccf0 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
2cd00 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
2cd10 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
2cd20 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
2cd30 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
2cd40 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2cd50 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
2cd60 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2cd70 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
2cd80 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2cd90 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
2cda0 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
2cdb0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2cdc0 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
2cdd0 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
2cde0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
2cdf0 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
2ce00 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
2ce10 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
2ce20 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
2ce30 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2ce40 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
2ce50 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2ce60 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2ce70 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
2ce80 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2ce90 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2cea0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
2ceb0 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
2cec0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2ced0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2cee0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
2cef0 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
2cf00 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
2cf10 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
2cf20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
2cf30 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
2cf40 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
2cf50 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
2cf60 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
2cf70 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
2cf80 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
2cf90 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
2cfa0 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
2cfb0 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
2cfc0 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
2cfd0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
2cfe0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2cff0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
2d000 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
2d010 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
2d020 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
2d030 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
2d040 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
2d050 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d060 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2d070 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2d080 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
2d090 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
2d0a0 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
2d0b0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
2d0c0 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
2d0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d0e0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
2d0f0 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2d100 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
2d110 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
2d120 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2d130 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
2d140 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
2d150 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
2d160 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
2d170 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
2d180 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
2d190 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
2d1a0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2d1b0 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
2d1c0 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
2d1d0 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
2d1e0 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63  trying to balanc
2d1f0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
2d200 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
2d210 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
2d220 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
2d230 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
2d240 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
2d250 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
2d260 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
2d270 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
2d280 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
2d290 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
2d2a0 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
2d2b0 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
2d2c0 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
2d2d0 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
2d2e0 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
2d2f0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
2d300 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
2d310 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
2d320 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
2d330 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
2d340 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
2d350 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
2d360 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
2d370 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
2d380 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
2d390 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
2d3a0 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
2d3b0 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
2d3c0 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
2d3d0 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
2d3e0 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
2d3f0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
2d400 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
2d410 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
2d420 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
2d430 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
2d440 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
2d450 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
2d460 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
2d470 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
2d480 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
2d490 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
2d4a0 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
2d4b0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2d4c0 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
2d4d0 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
2d4e0 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
2d4f0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
2d500 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
2d510 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
2d520 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
2d530 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
2d540 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2d550 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
2d560 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
2d570 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
2d580 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
2d590 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
2d5a0 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
2d5b0 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20  emPage *pNew;   
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5d0 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
2d5e0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2d5f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d610 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d620 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
2d630 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d650 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2d660 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
2d670 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d680 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2d690 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d6a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d6b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d6c0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2d6d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d6e0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2d6f0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  1 );..  /* This 
2d700 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  error condition 
2d710 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
2d720 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
2d730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2d740 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
2d750 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  ell<=0 ) return 
2d760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2d770 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
2d780 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
2d790 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
2d7a0 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
2d7b0 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
2d7c0 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
2d7d0 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
2d7e0 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
2d7f0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2d800 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
2d810 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
2d820 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
2d830 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
2d840 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
2d850 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2d860 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2d870 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
2d880 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
2d890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
2d8a0 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
2d8b0 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
2d8c0 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
2d8d0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2d8e0 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2d8f0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2d900 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2d910 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2d920 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d930 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d940 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2d950 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d960 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2d970 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2d980 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2d990 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2d9a0 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2d9b0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2d9c0 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2d9d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2d9e0 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2d9f0 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2da00 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2da10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2da20 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2da30 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2da40 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2da50 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2da60 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2da70 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2da80 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2da90 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2daa0 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2dab0 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2dac0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2dad0 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2dae0 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2daf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2db00 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2db10 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2db20 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2db30 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2db40 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2db50 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2db60 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2db70 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2db80 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2db90 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2dba0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2dbb0 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2dbc0 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2dbd0 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2dbe0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2dbf0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2dc00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dc10 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2dc20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2dc30 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
2dc40 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2dc50 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
2dc60 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2dc70 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2dc80 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d   ){.        ptrm
2dc90 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
2dca0 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  w, pCell, &rc);.
2dcb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dcc0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2dcd0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2dce0 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2dcf0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2dd00 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2dd10 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2dd20 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2dd30 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2dd40 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2dd50 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2dd60 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2dd70 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2dd80 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2dd90 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2dda0 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2ddb0 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2ddc0 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2ddd0 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2dde0 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2ddf0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2de00 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2de10 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2de20 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2de30 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2de40 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2de50 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2de60 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2de70 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2de80 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2de90 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2dea0 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2deb0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2dec0 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2ded0 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2dee0 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2def0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2df00 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2df10 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2df20 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2df30 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2df40 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2df50 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2df60 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2df70 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2df80 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2df90 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2dfa0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2dfb0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2dfc0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2dfd0 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2dfe0 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2dff0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2e000 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2e010 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2e020 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2e030 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2e040 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2e050 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2e060 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2e070 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2e080 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2e090 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2e0a0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2e0b0 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  nt, pParent->nCe
2e0c0 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74  ll, pSpace, (int
2e0d0 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a  )(pOut-pSpace),.
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2e0f0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26  , pPage->pgno, &
2e100 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  rc);..    /* Set
2e110 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2e120 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72   pointer of pPar
2e130 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
2e140 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2e150 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2e160 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2e170 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2e180 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
2e190 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
2e1a0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
2e1b0 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2e1c0 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
2e1d0 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
2e1e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
2e1f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2e200 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2e210 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a   */..#if 0./*.**
2e220 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
2e230 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
2e240 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  te anything to t
2e250 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
2e260 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73  SQLite..** it is
2e270 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76   sometimes activ
2e280 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79  ated temporarily
2e290 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67   while debugging
2e2a0 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c   code responsibl
2e2b0 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e  e .** for settin
2e2c0 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  g pointer-map en
2e2d0 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
2e2e0 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b   int ptrmapCheck
2e2f0 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a  Pages(MemPage **
2e300 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67  apPage, int nPag
2e310 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  e){.  int i, j;.
2e320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
2e330 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67  ge; i++){.    Pg
2e340 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a  no n;.    u8 e;.
2e350 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2e360 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a  ge = apPage[i];.
2e370 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
2e380 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2e390 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e3a0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2e3b0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61    for(j=0; j<pPa
2e3c0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b  ge->nCell; j++){
2e3d0 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
2e3e0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a  info;.      u8 *
2e3f0 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a  z;.     .      z
2e400 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2e410 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72  e, j);.      btr
2e420 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2e430 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b  Page, z, &info);
2e440 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
2e450 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
2e460 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
2e470 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66   get4byte(&z[inf
2e480 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2e490 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2e4a0 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20  (pBt, ovfl, &e, 
2e4b0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2e4c0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2e4d0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2e4e0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20  _OVERFLOW1 );.  
2e4f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e500 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e510 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69          Pgno chi
2e520 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29  ld = get4byte(z)
2e530 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2e540 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2e550 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2e560 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2e570 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2e580 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2e590 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e5a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e5b0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
2e5c0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2e5d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2e5e0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2e5f0 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  ]);.      ptrmap
2e600 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2e610 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61  &e, &n);.      a
2e620 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2e630 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2e640 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2e650 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2e660 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2e670 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e680 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  is used to copy 
2e690 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e6a0 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2e6b0 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61  stored .** on pa
2e6c0 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
2e6d0 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46   pTo. If page pF
2e6e0 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65  rom was not a le
2e6f0 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a  af page, then.**
2e700 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e710 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
2e720 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65  h child page are
2e730 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
2e740 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70   the.** parent p
2e750 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  age stored in th
2e760 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73  e pointer map is
2e770 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46   page pTo. If pF
2e780 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a  rom contained.**
2e790 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20   any cells with 
2e7a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
2e7b0 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65  inters, then the
2e7c0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
2e7d0 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
2e7e0 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75  tries are also u
2e7f0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
2e800 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2e810 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a  s page pTo..**.*
2e820 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75  * If pFrom is cu
2e830 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67  rrently carrying
2e840 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
2e850 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20  lls (entries in 
2e860 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  the.** MemPage.a
2e870 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
2e880 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
2e890 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
2e8a0 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
2e8b0 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
2e8c0 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
2e8d0 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
2e8e0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
2e8f0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
2e900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2e910 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
2e920 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
2e930 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
2e940 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
2e950 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
2e960 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
2e970 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
2e980 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
2e990 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
2e9a0 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
2e9b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
2e9c0 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
2e9d0 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
2e9e0 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
2e9f0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
2ea00 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
2ea10 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
2ea20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
2ea30 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
2ea40 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
2ea50 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
2ea60 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
2ea70 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
2ea80 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
2ea90 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
2eaa0 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
2eab0 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
2eac0 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
2ead0 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
2eae0 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
2eaf0 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
2eb00 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2eb10 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
2eb20 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
2eb30 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
2eb40 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
2eb50 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2eb60 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61  dr+5])<=pBt->usa
2eb70 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
2eb80 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
2eb90 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
2eba0 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
2ebb0 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
2ebc0 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
2ebd0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2ebe0 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
2ebf0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
2ec00 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
2ec10 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
2ec20 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
2ec30 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
2ec40 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
2ec50 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
2ec60 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
2ec70 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
2ec80 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
2ec90 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
2eca0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2ecb0 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
2ecc0 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
2ecd0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
2ece0 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
2ecf0 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
2ed00 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
2ed10 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
2ed20 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
2ed30 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
2ed40 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
2ed50 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
2ed60 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
2ed70 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
2ed80 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
2ed90 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
2eda0 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
2edb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2edc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2edd0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2ede0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2edf0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2ee00 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2ee10 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2ee20 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2ee30 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
2ee40 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
2ee50 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
2ee60 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
2ee70 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
2ee80 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
2ee90 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2eea0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
2eeb0 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
2eec0 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
2eed0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
2eee0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
2eef0 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
2ef00 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
2ef10 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
2ef20 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
2ef30 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
2ef40 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
2ef50 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
2ef60 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
2ef70 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
2ef80 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
2ef90 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
2efa0 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
2efb0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
2efc0 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
2efd0 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
2efe0 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
2eff0 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
2f000 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
2f010 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
2f020 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
2f030 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
2f040 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
2f050 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
2f060 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
2f070 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
2f080 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
2f090 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
2f0a0 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
2f0b0 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
2f0c0 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
2f0d0 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
2f0e0 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
2f0f0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2f100 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
2f110 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
2f120 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
2f130 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
2f140 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
2f150 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
2f160 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
2f170 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
2f180 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
2f190 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
2f1a0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
2f1b0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
2f1c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
2f1d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
2f1e0 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
2f1f0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
2f200 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
2f210 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
2f220 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
2f230 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
2f240 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
2f250 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2f260 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
2f270 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
2f280 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2f290 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
2f2a0 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
2f2b0 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
2f2c0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
2f2d0 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
2f2e0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
2f2f0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2f300 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
2f310 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
2f320 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
2f330 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2f340 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
2f350 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
2f360 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
2f370 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
2f380 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2f390 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
2f3a0 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
2f3b0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2f3c0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
2f3d0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
2f3e0 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
2f3f0 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
2f400 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
2f410 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
2f420 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
2f430 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
2f440 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
2f450 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
2f460 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
2f470 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
2f480 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
2f490 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2f4a0 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
2f4b0 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
2f4c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
2f4d0 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
2f4e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2f4f0 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
2f500 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
2f510 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
2f520 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2f530 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66  old one page. If
2f540 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
2f550 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
2f560 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28  parent.** page (
2f570 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61 72  pParent) the par
2f580 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
2f590 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20   overfull, this 
2f5a0 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65  buffer is.** use
2f5b0 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70  d to store the p
2f5c0 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77  arent's overflow
2f5d0 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20   cells. Because 
2f5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
2f5f0 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d  serts.** a maxim
2f600 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64  um of four divid
2f610 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
2f620 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61  e parent page, a
2f630 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  nd the maximum.*
2f640 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * size of a cell
2f650 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61   stored within a
2f660 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
2f670 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74  is always less t
2f680 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68  han 1/4.** of th
2f690 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
2f6a0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75   aOvflSpace[] bu
2f6b0 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  ffer is guarante
2f6c0 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
2f6d0 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c  * enough for all
2f6e0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2f6f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53  .**.** If aOvflS
2f700 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 61  pace is set to a
2f710 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74   null pointer, t
2f720 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2f730 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2f740 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
2f750 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
2f760 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20  root(.  MemPage 
2f770 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
2f780 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
2f790 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e  t page of siblin
2f7a0 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  gs being balance
2f7b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  d */.  int iPare
2f7c0 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ntIdx,          
2f7d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f7e0 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e  of "the page" in
2f7f0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38   pParent */.  u8
2f800 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20   *aOvflSpace,   
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f820 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
2f830 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61   of space for pa
2f840 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69  rent ovfl */.  i
2f850 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20  nt isRoot       
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f870 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
2f880 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65  t is a root-page
2f890 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
2f8a0 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
2f8b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2f8c0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
2f8d0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f8f0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
2f900 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
2f910 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
2f920 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2f930 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
2f940 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
2f950 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
2f960 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
2f970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f980 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2f990 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
2f9a0 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f9c0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2f9d0 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
2f9e0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa00 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2fa10 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa30 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
2fa40 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
2fa50 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
2fa60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2fa70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2fa80 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
2fa90 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
2faa0 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
2fab0 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
2fac0 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
2fad0 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
2fae0 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2faf0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2fb00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
2fb10 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
2fb20 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
2fb30 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
2fb40 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
2fb50 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
2fb60 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
2fb70 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
2fb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2fb90 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
2fba0 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
2fbb0 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
2fbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
2fbd0 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
2fbe0 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
2fbf0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
2fc00 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
2fc10 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2fc20 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
2fc30 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
2fc40 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
2fc50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2fc60 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2fc70 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
2fc80 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
2fc90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fca0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
2fcb0 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
2fcc0 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
2fcd0 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
2fce0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2fcf0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
2fd00 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
2fd10 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
2fd20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
2fd30 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
2fd40 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
2fd50 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
2fd60 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
2fd70 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2fd80 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
2fd90 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
2fda0 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fdc0 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
2fdd0 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
2fde0 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
2fdf0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
2fe00 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
2fe10 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
2fe20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
2fe30 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
2fe40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fe50 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
2fe60 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
2fe70 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
2fe80 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
2fe90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2fea0 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
2feb0 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
2fec0 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
2fed0 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
2fee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2fef0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
2ff00 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2ff10 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2ff20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2ff30 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2ff40 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
2ff50 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff70 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
2ff80 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
2ff90 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
2ffa0 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
2ffb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2ffc0 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
2ffd0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
2ffe0 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
2fff0 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
30000 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
30010 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
30020 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
30030 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
30040 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
30050 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
30060 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
30070 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
30080 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
30090 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
300a0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
300b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
300c0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
300d0 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
300e0 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
300f0 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
30100 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
30110 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
30120 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
30130 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
30140 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
30150 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
30160 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
30170 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30180 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
30190 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
301a0 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
301b0 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
301c0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
301d0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
301e0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
301f0 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
30200 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
30210 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
30220 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
30230 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  dx==iParentIdx )
30240 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
30250 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
30260 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
30270 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
30280 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
30290 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
302a0 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
302b0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
302c0 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
302d0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
302e0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
302f0 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
30300 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
30310 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
30320 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
30330 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
30340 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
30350 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
30360 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
30370 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
30380 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
30390 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
303a0 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
303b0 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
303c0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
303d0 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
303e0 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
303f0 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
30400 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
30410 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
30420 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
30430 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
30440 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
30450 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
30460 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
30470 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
30480 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
30490 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
304a0 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
304b0 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
304c0 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
304d0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
304e0 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
304f0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
30500 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
30510 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
30520 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e  nxDiv = 0;.    n
30530 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c  Old = i+1;.  }el
30540 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33  se{.    nOld = 3
30550 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e  ;.    if( iParen
30560 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20  tIdx==0 ){      
30570 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
30580 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
30590 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65   }else if( iPare
305a0 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20  ntIdx==i ){.    
305b0 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20    nxDiv = i-2;. 
305c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
305d0 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49  nxDiv = iParentI
305e0 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dx-1;.    }.    
305f0 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  i = 2;.  }.  if(
30600 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e   (i+nxDiv-pParen
30610 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70  t->nOverflow)==p
30620 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
30630 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70  .    pRight = &p
30640 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
30650 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
30660 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +8];.  }else{.  
30670 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43    pRight = findC
30680 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
30690 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
306a0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20  verflow);.  }.  
306b0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
306c0 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65  pRight);.  while
306d0 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ( 1 ){.    rc = 
306e0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
306f0 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64  Bt, pgno, &apOld
30700 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
30710 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
30720 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
30730 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
30740 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
30750 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30760 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
30770 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
30780 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
30790 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
307a0 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
307b0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
307c0 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
307d0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  t->aOvfl[0].idx 
307e0 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
307f0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
30800 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
30810 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  t->aOvfl[0].pCel
30820 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  l;.      pgno = 
30830 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
30840 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
30850 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
30860 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
30870 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  i]);.      pPare
30880 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  nt->nOverflow = 
30890 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
308a0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
308b0 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
308c0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
308d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
308e0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
308f0 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
30900 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
30910 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
30920 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
30930 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  .      /* Drop t
30940 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
30950 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70   parent page. ap
30960 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69  Div[i] still poi
30970 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
30980 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
30990 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e  the parent, even
309a0 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62   though it has b
309b0 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20  een dropped..   
309c0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61     ** This is sa
309d0 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70  fe because dropp
309e0 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20  ing a cell only 
309f0 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66  overwrites the f
30a00 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
30a10 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20  ur bytes of it, 
30a20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
30a30 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
30a40 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
30a50 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
30a60 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
30a70 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65  l. So the pointe
30a80 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  r is safe to use
30a90 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20  .      ** later 
30aa0 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20  on.  .      **. 
30ab0 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53       ** Unless S
30ac0 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
30ad0 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  d in secure-dele
30ae0 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  te mode. In this
30af0 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20   case,.      ** 
30b00 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
30b10 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
30b20 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
30b30 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
30b40 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
30b50 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
30b60 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
30b70 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
30b80 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
30b90 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
30ba0 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
30bb0 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
30bc0 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
30bd0 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
30be0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
30bf0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
30c00 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
30c10 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
30c20 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
30c30 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d  _INT(apDiv[i]) -
30c40 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
30c50 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  NT(pParent->aDat
30c60 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
30c70 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e  (iOff+szNew[i])>
30c80 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
30c90 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
30ca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30cb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30cc0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
30cd0 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
30ce0 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
30cf0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
30d00 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30d20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30d30 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66  &aOvflSpace[iOff
30d40 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
30d50 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ew[i]);.        
30d60 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
30d70 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
30d80 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
30d90 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
30da0 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43     }.      dropC
30db0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
30dc0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
30dd0 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69  verflow, szNew[i
30de0 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ], &rc);.    }. 
30df0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
30e00 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
30e10 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
30e20 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
30e30 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
30e40 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
30e50 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
30e60 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
30e70 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
30e80 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
30e90 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
30ea0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
30eb0 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
30ec0 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
30ed0 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
30ee0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30ef0 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f10 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
30f20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30f30 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
30f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f50 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
30f60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
30f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30f90 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
30fa0 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30fd0 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
30fe0 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
30ff0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
31000 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
31010 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
31020 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
31030 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
31040 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
31050 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
31060 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
31070 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
31080 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
31090 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
310a0 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
310b0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
310c0 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
310d0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
310e0 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
310f0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
31100 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
31110 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
31120 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
31130 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
31140 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
31150 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
31160 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
31170 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
31180 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
31190 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
311a0 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
311b0 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
311c0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
311d0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
311e0 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
311f0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
31200 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
31210 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
31220 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
31230 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
31240 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
31250 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
31260 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
31270 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
31280 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
31290 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
312a0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
312b0 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
312c0 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
312d0 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
312e0 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
312f0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
31300 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
31310 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
31320 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
31330 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
31340 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
31350 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
31360 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
31370 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
31380 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
31390 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
313a0 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
313b0 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
313c0 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
313d0 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
313e0 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
313f0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
31400 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
31410 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
31420 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
31430 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
31440 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
31450 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
31460 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
31470 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
31480 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
31490 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
314a0 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
314b0 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
314c0 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
314d0 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
314e0 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
314f0 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
31500 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
31510 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
31520 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
31530 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
31540 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
31550 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
31560 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
31570 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
31580 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
31590 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
315a0 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
315b0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
315c0 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
315d0 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
315e0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
315f0 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
31600 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
31610 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
31620 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
31630 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
31640 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
31650 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
31660 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
31670 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
31680 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
31690 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
316a0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
316b0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
316c0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
316d0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
316e0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
316f0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
31700 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
31710 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
31720 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
31730 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
31740 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
31750 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
31760 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
31770 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
31780 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
31790 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
317a0 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
317b0 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
317c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
317d0 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
317e0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
317f0 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
31800 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
31810 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
31820 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
31830 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
31840 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
31850 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
31860 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
31870 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
31880 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
31890 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
318a0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
318b0 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
318c0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
318d0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
318e0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
318f0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
31900 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
31910 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
31920 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
31930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
31940 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
31950 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
31960 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
31970 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
31980 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
31990 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
319a0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
319b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
319c0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
319d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
319e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
319f0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
31a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
31a10 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
31a20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
31a30 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
31a40 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
31a50 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
31a60 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
31a70 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
31a80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31a90 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
31aa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
31ab0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
31ac0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31ad0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
31ae0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
31af0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
31b00 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
31b10 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
31b20 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
31b30 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
31b40 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
31b50 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
31b60 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
31b70 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
31b80 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
31b90 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
31ba0 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
31bb0 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
31bc0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
31bd0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
31be0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
31bf0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
31c00 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
31c10 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
31c20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
31c30 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
31c40 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
31c50 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
31c60 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
31c70 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
31c80 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
31c90 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
31ca0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
31cb0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
31cc0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
31cd0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
31ce0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
31cf0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
31d00 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
31d10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
31d20 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
31d30 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
31d40 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
31d50 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
31d60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
31d70 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
31d80 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
31d90 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
31da0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
31db0 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
31dc0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
31dd0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
31de0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
31df0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
31e00 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
31e10 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
31e20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
31e30 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
31e40 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
31e50 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
31e60 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
31e70 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
31e80 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
31e90 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
31ea0 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
31eb0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31ec0 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
31ed0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
31ee0 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
31ef0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
31f00 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
31f10 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
31f20 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
31f30 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
31f40 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
31f50 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
31f60 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
31f70 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
31f80 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
31f90 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
31fa0 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
31fb0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
31fc0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
31fd0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
31fe0 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
31ff0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
32000 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
32010 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
32020 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
32030 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
32040 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
32050 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
32060 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
32070 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
32080 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
32090 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
320a0 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
320b0 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
320c0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
320d0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
320e0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
320f0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
32100 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
32110 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
32120 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
32130 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
32140 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
32150 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
32160 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
32170 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
32180 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
32190 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
321a0 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
321b0 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
321c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
321d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
321e0 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
321f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
32200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32210 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
32220 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
32230 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
32240 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
32250 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
32260 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
32270 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
32280 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
32290 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
322a0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
322b0 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
322c0 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
322d0 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
322e0 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
322f0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
32300 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
32310 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
32320 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
32330 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
32340 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
32350 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
32360 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
32370 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
32380 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
32390 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
323a0 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
323b0 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
323c0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
323d0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
323e0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
323f0 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
32400 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
32410 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
32420 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
32430 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
32440 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
32450 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
32460 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
32470 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
32480 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
32490 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
324a0 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
324b0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
324c0 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  0) );..  TRACE((
324d0 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
324e0 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20  d %d %d  ",.    
324f0 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apOld[0]->pgno, 
32500 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61  .    nOld>=2 ? a
32510 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[1]->pgno : 
32520 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
32530 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20   apOld[2]->pgno 
32540 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a  : 0.  ));..  /*.
32550 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
32560 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
32570 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
32580 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
32590 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d  .  if( apOld[0]-
325a0 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20  >pgno<=1 ){.    
325b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
325c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
325d0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
325e0 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
325f0 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
32600 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
32610 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
32620 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
32630 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
32640 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
32650 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
32660 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
32670 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
32680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32690 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
326a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
326b0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
326c0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
326d0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
326e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
326f0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
32700 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
32710 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
32720 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
32730 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
32740 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
32750 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
32760 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
32770 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
32780 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
32790 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
327a0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
327b0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
327c0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
327d0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
327e0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
327f0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
32800 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
32810 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
32820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32840 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
32850 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32870 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
32880 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
32890 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
328a0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
328b0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
328c0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
328d0 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
328e0 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
328f0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
32900 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32910 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
32920 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
32930 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
32940 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
32950 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
32960 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
32970 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
32980 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
32990 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
329a0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
329b0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
329c0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
329d0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
329e0 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
329f0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
32a00 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
32a10 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
32a20 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
32a30 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
32a40 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
32a50 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
32a60 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
32a70 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
32a80 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
32a90 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
32aa0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
32ab0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
32ac0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
32ad0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
32ae0 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
32af0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
32b00 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
32b10 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
32b20 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
32b30 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
32b40 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
32b50 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
32b60 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
32b70 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
32b80 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
32b90 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
32ba0 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
32bb0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
32bc0 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
32bd0 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
32be0 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
32bf0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
32c00 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
32c10 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
32c20 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
32c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
32c40 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
32c50 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
32c60 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
32c70 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
32c80 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
32c90 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
32ca0 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
32cb0 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
32cc0 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
32cd0 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
32ce0 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
32cf0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
32d00 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
32d10 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
32d20 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
32d30 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
32d40 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
32d50 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
32d60 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
32d70 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
32d80 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
32d90 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
32da0 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
32db0 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
32dc0 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
32dd0 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
32de0 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
32df0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
32e00 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
32e10 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
32e20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32e30 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
32e40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
32e50 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
32e60 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
32e70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
32e80 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
32e90 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
32ea0 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
32eb0 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
32ec0 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
32ed0 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
32ee0 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
32ef0 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
32f00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
32f10 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
32f20 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
32f30 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
32f40 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
32f50 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
32f60 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
32f70 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
32f80 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
32f90 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
32fa0 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
32fb0 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
32fc0 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
32fd0 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
32fe0 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
32ff0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
33000 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
33010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
33020 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
33030 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
33040 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
33050 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
33060 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
33070 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
33080 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
33090 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
330a0 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
330b0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
330c0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
330d0 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
330e0 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
330f0 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
33100 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
33110 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
33120 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
33130 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
33140 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
33150 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
33160 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
33170 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
33180 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
33190 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
331a0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
331b0 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
331c0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
331d0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
331e0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
331f0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
33200 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
33210 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
33220 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
33230 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
33240 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
33250 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
33260 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
33270 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
33280 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
33290 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
332a0 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
332b0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
332c0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
332d0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
332e0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
332f0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
33300 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
33310 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
33320 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
33330 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
33340 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
33350 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
33360 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
33370 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
33380 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
33390 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
333a0 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
333b0 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
333c0 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
333d0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
333e0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
333f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
33400 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
33410 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
33420 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
33430 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
33440 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
33450 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
33460 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
33470 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
33480 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
33490 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
334a0 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
334b0 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
334c0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
334d0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
334e0 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
334f0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
33500 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
33510 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
33520 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
33530 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
33540 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
33550 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
33560 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
33570 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
33580 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
33590 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
335a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
335b0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
335c0 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
335d0 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
335e0 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
335f0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
33600 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
33610 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
33620 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
33630 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
33640 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
33650 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
33660 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
33670 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33680 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
33690 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
336a0 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
336b0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
336c0 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
336d0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
336e0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
336f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33700 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
33710 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33720 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  sz<=pBt->maxLoca
33730 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73  l+23 );.      as
33740 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65  sert( iOvflSpace
33750 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
33760 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43  );.      insertC
33770 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
33780 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
33790 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Temp, pNew->pgno
337a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
337b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
337c0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
337d0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
337e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
337f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
33800 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
33810 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
33820 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
33830 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
33840 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
33850 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
33860 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
33870 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
33880 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
33890 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
338a0 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
338b0 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
338c0 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
338d0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
338e0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
338f0 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
33900 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
33910 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
33920 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
33930 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
33940 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
33950 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
33960 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
33970 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
33980 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
33990 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
339a0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
339b0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
339c0 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
339d0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
339e0 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
339f0 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
33a00 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
33a10 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
33a20 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
33a30 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
33a40 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
33a50 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
33a60 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
33a70 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
33a80 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
33a90 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
33aa0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
33ab0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
33ac0 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
33ad0 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
33ae0 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
33af0 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
33b00 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
33b10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
33b20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
33b30 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
33b40 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
33b50 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
33b60 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
33b70 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
33b80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33b90 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
33ba0 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
33bb0 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
33bc0 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
33bd0 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
33be0 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
33bf0 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
33c00 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
33c10 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
33c20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
33c30 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
33c40 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
33c50 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
33c60 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33c70 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
33c80 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
33c90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
33ca0 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
33cb0 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
33cc0 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
33cd0 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
33ce0 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
33cf0 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
33d00 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f  ) .    );.    co
33d10 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
33d20 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c  New[0], pParent,
33d30 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50   &rc);.    freeP
33d40 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72  age(apNew[0], &r
33d50 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
33d60 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
33d70 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70      /* Fix the p
33d80 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
33d90 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63  es for all the c
33da0 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73  ells that were s
33db0 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a  hifted around. .
33dc0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
33dd0 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
33de0 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e  nt types of poin
33df0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
33e00 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20  that need to.   
33e10 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
33e20 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  h by this routin
33e30 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65  e. Some of these
33e40 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
33e50 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20  lready, but.    
33e60 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74  ** many have not
33e70 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
33e80 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20  is a summary:.  
33e90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29    **.    **   1)
33ea0 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
33eb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
33ec0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
33ed0 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20  hat were not.   
33ee0 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67   **      sibling
33ef0 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  s when this func
33f00 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
33f10 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65   These have alre
33f20 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ady.    **      
33f30 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e  been set. We don
33f40 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79  't need to worry
33f50 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69   about old sibli
33f60 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20  ngs that were.  
33f70 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20    **      moved 
33f80 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
33f90 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28   - the freePage(
33fa0 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e  ) code has taken
33fb0 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   care.    **    
33fc0 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20    of those..    
33fd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54  **.    **   2) T
33fe0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
33ff0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
34000 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
34010 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
34020 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
34030 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
34040 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
34050 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
34060 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se .    **      
34070 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
34080 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
34090 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
340a0 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
340b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33     **.    **   3
340c0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
340d0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
340e0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
340f0 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20  child pages of. 
34100 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73     **      cells
34110 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73   stored on the s
34120 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79  ibling pages may
34130 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
34140 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
34150 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73  **   4) If the s
34160 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
34170 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e   not internal in
34180 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e  tkey nodes, then
34190 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20   any.    **     
341a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
341b0 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65  used by these ce
341c0 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  lls may need to 
341d0 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a  be updated.    *
341e0 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c  *      (internal
341f0 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65   intkey nodes ne
34200 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  ver contain poin
34210 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77  ters to overflow
34220 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a   pages)..    **.
34230 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74      **   5) If t
34240 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
34250 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
34260 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
34270 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20  r-map.    **    
34280 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68    entries for th
34290 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61  e right-child pa
342a0 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c  ges of each sibl
342b0 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ing may need.   
342c0 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75   **      to be u
342d0 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
342e0 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e     ** Cases 1 an
342f0 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69  d 2 are dealt wi
34300 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65  th above by othe
34310 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74  r code. The next
34320 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65  .    ** block de
34330 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33  als with cases 3
34340 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f   and 4 and the o
34350 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63  ne after that, c
34360 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20  ase 5. Since.   
34370 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f   ** setting a po
34380 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
34390 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20  is a relatively 
343a0 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
343b0 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a  ion, this.    **
343c0 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20   code only sets 
343d0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
343e0 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72  ies for child or
343f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
34400 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a  that have.    **
34410 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20   actually moved 
34420 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20  between pages.  
34430 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
34440 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b  pNew = apNew[0];
34450 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
34460 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a  ld = apCopy[0];.
34470 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f      int nOverflo
34480 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
34490 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65  low;.    int iNe
344a0 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43  xtOld = pOld->nC
344b0 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b  ell + nOverflow;
344c0 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c  .    int iOverfl
344d0 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20  ow = (nOverflow 
344e0 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  ? pOld->aOvfl[0]
344f0 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20  .idx : -1);.    
34500 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
34510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34520 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
34530 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
34540 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
34550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
34570 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
34580 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
34590 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
345a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
345b0 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
345c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
345d0 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
345e0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
345f0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
34600 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
34610 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
34620 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
34630 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
34640 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
34650 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
34660 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
34670 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
34680 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
34690 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
346a0 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
346b0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
346c0 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
346d0 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
346e0 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
346f0 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
34700 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
34710 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
34720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
34730 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
34740 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
34750 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
34760 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
34770 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
34780 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
34790 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
347a0 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
347b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
347c0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
347d0 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
347e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
347f0 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
34800 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
34810 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
34820 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
34830 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
34840 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
34850 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
34860 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
34870 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
34880 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
34890 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
348a0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
348b0 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
348c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
348d0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
348e0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
348f0 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
34900 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
34910 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
34920 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
34930 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
34940 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
34950 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
34960 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
34970 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
34980 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
34990 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
349a0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
349b0 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
349c0 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
349d0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
349e0 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
349f0 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
34a00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
34a10 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34a20 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
34a30 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
34a40 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
34a50 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
34a60 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
34a70 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
34a80 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
34a90 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
34aa0 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
34ab0 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
34ac0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
34ad0 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
34ae0 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
34af0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
34b00 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
34b10 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
34b20 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
34b30 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
34b40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
34b50 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
34b60 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
34b70 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
34b80 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
34b90 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
34ba0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
34bb0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
34bc0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
34bd0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
34be0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
34bf0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
34c00 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
34c10 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
34c20 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
34c30 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
34c40 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
34c50 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
34c60 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
34c70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
34c80 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
34c90 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
34ca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
34cb0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
34cc0 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
34cd0 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
34ce0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
34cf0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
34d00 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
34d10 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
34d20 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
34d30 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
34d40 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
34d50 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
34d60 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
34d70 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
34d80 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
34d90 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
34da0 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
34db0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
34dc0 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
34dd0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
34de0 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
34df0 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
34e00 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
34e10 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
34e20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
34e30 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
34e40 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
34e50 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
34e60 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
34e70 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
34e80 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
34e90 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
34ea0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
34eb0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
34ec0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
34ed0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
34ee0 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
34ef0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
34f00 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
34f10 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
34f20 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
34f30 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
34f40 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
34f50 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
34f60 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
34f70 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
34f80 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
34f90 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
34fa0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
34fb0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
34fc0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
34fd0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
34fe0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
34ff0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
35000 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
35010 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
35020 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
35030 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
35040 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
35050 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
35060 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
35070 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
35080 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
35090 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
350a0 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
350b0 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
350c0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
350d0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
350e0 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
350f0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
35100 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
35110 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
35120 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
35130 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
35140 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
35150 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
35160 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
35170 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
35180 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35190 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
351a0 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
351b0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
351c0 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
351d0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
351e0 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
351f0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
35200 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
35210 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
35220 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
35230 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
35240 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
35250 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
35260 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
35270 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
35280 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
35290 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
352a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
352b0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
352c0 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
352d0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
352e0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
352f0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
35300 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
35310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
35320 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
35330 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
35340 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
35350 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
35360 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
35370 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
35380 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
35390 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
353a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
353b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
353c0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
353d0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
353e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
353f0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
35400 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
35410 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
35420 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
35430 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  noChild = 0;    
35440 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35450 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
35460 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
35470 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35480 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
35490 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
354a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
354b0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
354c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
354d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
354e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
354f0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
35500 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
35510 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
35520 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
35530 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
35540 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
35550 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
35560 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
35570 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
35580 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
35590 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
355a0 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
355b0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
355c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
355d0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
355e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
355f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35600 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
35610 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
35620 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68  ,&pChild,&pgnoCh
35630 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  ild,pRoot->pgno,
35640 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65  0);.    copyNode
35650 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70  Content(pRoot, p
35660 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20  Child, &rc);.   
35670 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
35680 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
35690 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68  pPut(pBt, pgnoCh
356a0 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  ild, PTRMAP_BTRE
356b0 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  E, pRoot->pgno, 
356c0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
356d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
356e0 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  *ppChild = 0;.  
356f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
35700 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
35710 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
35720 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
35730 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
35740 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
35750 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35760 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35770 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
35780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35790 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52  Child->nCell==pR
357a0 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  oot->nCell );.. 
357b0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
357c0 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
357d0 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74  nto %d\n", pRoot
357e0 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
357f0 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pgno));..  /* Co
35800 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  py the overflow 
35810 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74  cells from pRoot
35820 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20   to pChild */.  
35830 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
35840 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76  Ovfl, pRoot->aOv
35850 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  fl, pRoot->nOver
35860 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f  flow*sizeof(pRoo
35870 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  t->aOvfl[0]));. 
35880 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
35890 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
358a0 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
358b0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
358c0 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
358d0 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
358e0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
358f0 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
35900 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
35910 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
35920 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
35930 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
35940 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
35950 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
35960 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
35970 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
35980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
35990 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
359a0 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
359b0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
359c0 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
359d0 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
359e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
359f0 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
35a00 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
35a10 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
35a20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
35a30 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
35a40 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
35a50 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
35a60 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
35a70 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
35a80 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
35a90 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
35aa0 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
35ab0 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
35ac0 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
35ad0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
35ae0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
35af0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
35b00 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
35b10 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
35b20 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35b30 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
35b40 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
35b50 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
35b60 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
35b70 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
35b80 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
35b90 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
35ba0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
35bb0 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
35bc0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
35bd0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
35be0 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
35bf0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
35c00 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
35c10 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
35c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
35c30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35c40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
35c50 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
35c60 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
35c70 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
35c80 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
35c90 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
35ca0 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
35cb0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
35cc0 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
35cd0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
35ce0 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
35cf0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
35d00 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
35d10 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
35d20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
35d30 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
35d40 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
35d50 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
35d60 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
35d70 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
35d80 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
35d90 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
35da0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
35db0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
35dc0 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
35dd0 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
35de0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35df0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
35e00 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
35e10 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
35e20 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
35e30 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
35e40 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
35e50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
35e60 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
35e70 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
35e80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
35e90 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
35ea0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
35eb0 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
35ec0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
35ed0 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
35ee0 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
35ef0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35f00 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
35f10 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
35f20 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
35f30 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
35f40 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
35f50 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
35f60 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
35f70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35f80 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
35f90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
35fb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35fc0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
35fd0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
35fe0 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
35ff0 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
36000 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
36010 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
36020 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
36030 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
36040 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
36050 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
36060 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
36070 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
36080 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
36090 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
360a0 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
360b0 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
360c0 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
360d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
360e0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
360f0 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
36100 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
36110 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
36120 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
36130 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
36140 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
36150 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
36160 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
36170 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
36180 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
36190 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
361a0 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
361b0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
361c0 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
361d0 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
361e0 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
361f0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
36200 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
36210 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
36220 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
36230 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
36240 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
36250 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
36260 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
36270 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
36280 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
36290 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
362a0 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
362b0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
362c0 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
362d0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
362e0 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
362f0 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
36300 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
36310 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
36320 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
36330 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
36340 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
36350 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
36360 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
36370 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
36380 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
36390 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
363a0 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
363b0 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
363c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
363d0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
363e0 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
363f0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
36400 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
36410 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
36420 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
36430 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
36440 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
36450 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
36460 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
36470 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
36480 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
36490 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
364a0 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
364b0 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
364c0 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
364d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
364e0 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
364f0 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
36500 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
36510 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
36520 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
36530 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
36540 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
36550 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
36560 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
36570 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
36580 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
36590 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
365a0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
365b0 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
365c0 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
365d0 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
365e0 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
365f0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
36600 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36610 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
36620 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
36630 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
36640 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
36650 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
36660 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
36670 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
36680 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
36690 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
366a0 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
366b0 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
366c0 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
366d0 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
366e0 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
366f0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
36700 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
36710 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
36720 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
36730 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
36740 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
36750 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
36760 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
36770 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
36780 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
36790 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
367a0 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
367b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
367c0 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
367d0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
367e0 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
367f0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
36800 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
36810 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
36820 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
36830 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
36840 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
36850 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
36860 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
36870 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
36880 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
36890 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
368a0 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
368b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
368c0 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
368d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
368e0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
368f0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
36900 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
36910 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
36920 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
36930 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
36940 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
36950 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
36960 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
36970 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
36980 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
36990 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
369a0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
369b0 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
369c0 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
369d0 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
369e0 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
369f0 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
36a00 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
36a10 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
36a20 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
36a30 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
36a40 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
36a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
36a60 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
36a70 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
36a80 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
36a90 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36aa0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
36ab0 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
36ac0 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
36ad0 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
36ae0 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
36af0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
36b00 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
36b10 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
36b20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
36b30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
36b40 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
36b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
36b60 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
36b70 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  erflow = 0;..   
36b80 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69     /* The next i
36b90 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
36ba0 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73  do-loop balances
36bb0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36bc0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61  . */.      relea
36bd0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
36be0 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
36bf0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  --;.    }.  }whi
36c00 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
36c10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65  K );..  if( pFre
36c20 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
36c30 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
36c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36c50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  ;.}.../*.** Inse
36c60 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
36c70 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
36c80 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
36c90 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
36ca0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
36cb0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
36cc0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
36cd0 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
36ce0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
36cf0 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
36d00 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
36d10 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
36d20 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
36d30 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
36d40 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
36d50 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
36d60 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
36d70 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
36d80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
36d90 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
36da0 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
36db0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
36dc0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
36dd0 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
36de0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
36df0 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
36e00 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
36e10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36e20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
36e30 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e  l to.** MovetoUn
36e40 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b  packed() to seek
36e50 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20   cursor pCur to 
36e60 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73  (pKey, nKey) has
36e70 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
36e80 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b   performed. seek
36e90 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65  Result is the se
36ea0 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75  arch result retu
36eb0 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65  rned (a negative
36ec0 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43  .** number if pC
36ed0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
36ee0 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d  entry that is sm
36ef0 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79  aller than (pKey
36f00 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61  , nKey), or.** a
36f10 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
36f20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
36f30 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69  t an etry that i
36f40 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a  s larger than .*
36f50 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e  * (pKey, nKey)).
36f60 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
36f70 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
36f80 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
36f90 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
36fa0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
36fb0 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20  .** cursor pCur 
36fc0 69 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  is pointing at t
36fd0 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79  he existing copy
36fe0 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69   of a row that i
36ff0 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77  s to be.** overw
37000 72 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20  ritten.  If the 
37010 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
37020 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
37030 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a  cursor pCur may.
37040 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  ** point to any 
37050 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65  entry or to no e
37060 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20  ntry at all and 
37070 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  so this function
37080 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20   has to seek.** 
37090 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72  the cursor befor
370a0 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61  e the new key ca
370b0 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  n be inserted..*
370c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
370d0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
370e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
370f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37100 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
37110 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
37120 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
37130 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
37140 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
37150 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
37160 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
37170 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
37180 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
37190 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
371a0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
371b0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
371c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
371d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
371e0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
371f0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
37200 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c   int appendBias,
37210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37220 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
37230 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
37240 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  end */.  int see
37250 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  kResult         
37260 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
37270 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74  t of prior Movet
37280 6f 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c  oUnpacked() call
37290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
372a0 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65  .  int loc = see
372b0 6b 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  kResult;        
372c0 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20    /* -1: before 
372d0 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e  desired location
372e0 20 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20    +1: after */. 
372f0 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a   int szNew = 0;.
37300 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
37310 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
37320 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
37330 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
37340 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
37350 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
37360 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
37370 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
37380 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Cell = 0;..  if(
37390 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
373a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
373b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
373c0 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
373d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75  E_OK );.    retu
373e0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
373f0 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
37400 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
37410 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
37420 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
37430 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
37440 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
37450 57 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72  WRITE && !pBt->r
37460 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73  eadOnly );.  ass
37470 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
37480 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
37490 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
374a0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d  pCur->pKeyInfo!=
374b0 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  0, 2) );..  /* A
374c0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
374d0 61 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63  aller has been c
374e0 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68  onsistent. If th
374f0 69 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  is cursor was op
37500 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74  ened.  ** expect
37510 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74  ing an index b-t
37520 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ree, then the ca
37530 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69  ller should be i
37540 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20  nserting blob.  
37550 2a 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20  ** keys with no 
37560 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e  associated data.
37570 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77   If the cursor w
37580 61 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74  as opened expect
37590 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b  ing an.  ** intk
375a0 65 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61  ey table, the ca
375b0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69  ller should be i
375c0 6e 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72  nserting integer
375d0 20 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a   keys with a.  *
375e0 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69  * blob of associ
375f0 61 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20  ated data.  */. 
37600 20 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d   assert( (pKey==
37610 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
37620 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
37630 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
37640 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62  nsert into a tab
37650 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c  le b-tree, inval
37660 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
37670 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  ob .  ** cursors
37680 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77   open on the row
37690 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
376a0 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69  (assuming this i
376b0 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  s a replace.  **
376c0 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20   operation - if 
376d0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
376e0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
376f0 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  -op).  */.  if( 
37700 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
37710 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
37720 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
37730 72 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a  rs(p, nKey, 0);.
37740 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
37750 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
37760 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
37770 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
37780 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
37790 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
377a0 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  he call to btree
377b0 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
377c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
377d0 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
377e0 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
377f0 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
37800 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
37810 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
37820 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
37830 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
37840 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
37850 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
37860 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
37870 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
37880 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
37890 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
378a0 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
378b0 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
378c0 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
378d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74   In this case bt
378e0 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f  reeMoveto() reco
378f0 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74  gnizes.  ** that
37900 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
37910 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20  lready where it 
37920 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20  needs to be and 
37930 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a  returns without.
37940 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77    ** doing any w
37950 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68  ork. To avoid th
37960 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70  warting these op
37970 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20  timizations, it 
37980 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a  is important.  *
37990 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74  * not to clear t
379a0 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a  he cursor here..
379b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65    */.  rc = save
379c0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
379d0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
379e0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
379f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
37a00 66 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72  f( !loc ){.    r
37a10 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
37a20 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
37a30 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c  , appendBias, &l
37a40 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  oc);.    if( rc 
37a50 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37a60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
37a70 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
37a80 56 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e  VALID || (pCur->
37a90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
37aa0 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29  NVALID && loc) )
37ab0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
37ac0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37ad0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
37ae0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
37af0 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
37b00 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
37b10 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69  eaf || !pPage->i
37b20 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43  ntKey );..  TRAC
37b30 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
37b40 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
37b50 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
37b60 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
37b70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
37b80 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
37b90 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
37ba0 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
37bb0 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
37bc0 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
37bd0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
37be0 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65  it );.  allocate
37bf0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
37c00 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d    newCell = pBt-
37c10 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66  >pTmpSpace;.  if
37c20 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
37c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37c40 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
37c50 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
37c60 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
37c70 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
37c80 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
37c90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37ca0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
37cb0 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
37cc0 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
37cd0 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
37ce0 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
37cf0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
37d00 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  ;.  idx = pCur->
37d10 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
37d20 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30  e];.  if( loc==0
37d30 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c   ){.    u16 szOl
37d40 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  d;.    assert( i
37d50 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
37d60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
37d70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37d80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
37d90 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37da0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
37db0 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
37dc0 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
37dd0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
37de0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
37df0 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
37e00 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
37e10 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
37e20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
37e30 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
37e40 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
37e50 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
37e60 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
37e70 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
37e80 69 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29  idx, szOld, &rc)
37e90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
37ea0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
37eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
37ec0 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
37ed0 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
37ee0 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
37ef0 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43  ;.    idx = ++pC
37f00 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
37f10 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b  iPage];.  }else{
37f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37f30 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
37f40 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
37f50 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ge, idx, newCell
37f60 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26  , szNew, 0, 0, &
37f70 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rc);.  assert( r
37f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37f90 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
37fa0 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
37fb0 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ow>0 );..  /* If
37fc0 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
37fd0 63 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20  cured and pPage 
37fe0 68 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  has an overflow 
37ff0 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  cell, call balan
38000 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65  ce() .  ** to re
38010 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63  distribute the c
38020 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  ells within the 
38030 74 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61  tree. Since bala
38040 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20  nce() may move. 
38050 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20   ** the cursor, 
38060 7a 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f  zero the BtCurso
38070 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64  r.info.nSize and
38080 20 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e   BtCursor.validN
38090 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  Key.  ** variabl
380a0 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  es..  **.  ** Pr
380b0 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
380c0 6f 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64  of SQLite called
380d0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f   moveToRoot() to
380e0 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   move the cursor
380f0 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68  .  ** back to th
38100 65 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62  e root page as b
38110 61 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f  alance() used to
38120 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
38130 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
38140 20 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65   BtCursor.apPage
38150 5b 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  [] and BtCursor.
38160 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64  aiIdx[]. Instead
38170 20 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a   of doing that,.
38180 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72    ** set the cur
38190 73 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e  sor state to "in
381a0 76 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b  valid". This mak
381b0 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74  es common insert
381c0 20 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a   operations.  **
381d0 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
381e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72  ..  **.  ** Ther
381f0 65 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75  e is a subtle bu
38200 74 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69  t important opti
38210 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f  mization here to
38220 6f 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e  o. When insertin
38230 67 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  g.  ** multiple 
38240 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20  records into an 
38250 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73  intkey b-tree us
38260 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72  ing a single cur
38270 73 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a  sor (as can.  **
38280 20 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72   happen while pr
38290 6f 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53  ocessing an "INS
382a0 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c  ERT INTO ... SEL
382b0 45 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c  ECT" statement),
382c0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61   it.  ** is adva
382d0 6e 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76  ntageous to leav
382e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  e the cursor poi
382f0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
38300 74 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  t entry in.  ** 
38310 74 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f  the b-tree if po
38320 73 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63  ssible. If the c
38330 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
38340 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
38350 73 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e  st.  ** entry in
38360 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20   the table, and 
38370 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73  the next row ins
38380 65 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74  erted has an int
38390 65 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61  eger key.  ** la
383a0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
383b0 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b  rgest existing k
383c0 65 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  ey, it is possib
383d0 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  le to insert the
383e0 0a 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75  .  ** row withou
383f0 74 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75  t seeking the cu
38400 72 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62  rsor. This can b
38410 65 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61  e a big performa
38420 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a  nce boost..  */.
38430 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
38440 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
38450 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
38460 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38470 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
38480 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63  erflow ){.    rc
38490 20 3d 20 62 61 6c 61 6e