/ Hex Artifact Content
Login

Artifact 378a0f39d6e25cc3f7c40db3d90ec6f0a29e7733:


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: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2140: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2150: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2160: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2170: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2180: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
21a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
21b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
21c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
21d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
21e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
21f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2200: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2210: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2220: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2230: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2240: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2250: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2260: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2270: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2280: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2290: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
22a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
22b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
22c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
22d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
22e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
22f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2300: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2310: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2320: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2330: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2340: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2350: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2360: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2370: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2380: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2390: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
23b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
23c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
23d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
23e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
23f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2400: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2410: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2420: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2430: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2440: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2450: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2460: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2470: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2480: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
24a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
24b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
24c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
24d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
24e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2500: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2520: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2530: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2540: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2560: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2570: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2580: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2590: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
25a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
25b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
25c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
25d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
25e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
25f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2600: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2620: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2630: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2640: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2650: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2660: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2670: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2680: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2690: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
26a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
26b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
26c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
26d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
26e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
26f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2700: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2710: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2720: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2730: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2740: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2750: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2760: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2770: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2780: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2790: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
27a0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
27b0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
27c0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
27d0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
27e0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
27f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2800: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2810: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2820: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2830: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2840: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2850: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2860: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2870: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2880: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2890: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
28a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
28b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
28c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
28d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28e0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
28f0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2900: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2910: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2920: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2930: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2940: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2950: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2960: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2970: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2980: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2990: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
29a0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
29b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
29c0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
29d0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
29e0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
29f0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2a10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2a20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2a30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2a50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2a80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2a90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2aa0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2ab0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2ac0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2ad0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2ae0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2af0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2b00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2b10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2b30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2b50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2b60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2b70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2b80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2b90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ba0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2bc0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2bd0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2be0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2bf0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2c30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2c40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2c50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2c60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2c70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2c80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2c90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2cb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2cd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2ce0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2cf0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
2d00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d20: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
2d30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2d40: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
2d50: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
2d60: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
2d70: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
2d80: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
2d90: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
2da0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
2db0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
2dc0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
2dd0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
2de0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
2e00: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
2e10: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
2e20: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
2e30: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
2e40: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
2e50: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
2e60: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
2e70: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
2e80: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
2e90: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
2ea0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
2eb0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
2ec0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2ef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2f00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2f20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2f30: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
2f40: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
2f50: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
2f60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
2f70: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2f80: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
2f90: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
2fa0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
2fd0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
2fe0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2ff0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3000: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3010: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3020: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3030: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3040: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3050: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3060: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3070: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3080: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3090: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
30a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
30b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
30c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
30e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
30f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3100: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3110: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3120: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3130: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3140: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3150: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3160: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3170: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3180: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3190: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
31a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
31b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3200: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3210: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3230: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3240: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3260: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3280: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
32b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
32d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
32f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3300: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3310: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3320: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3330: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3340: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3350: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3360: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3370: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3380: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
33b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
33c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3400: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3410: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3420: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3430: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3450: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3460: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3470: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3480: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3490: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
34a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
34b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
34c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
34d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
34e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
34f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3500: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3510: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3520: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3530: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3540: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3550: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3560: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3590: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
35a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
35b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
35c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
35d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
35e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
35f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3600: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3610: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3620: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3630: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3640: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3650: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3660: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3670: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3680: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3690: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
36a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
36b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
36c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
36d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
36e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
36f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3710: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3720: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3740: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3750: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3760: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3780: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3790: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
37a0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
37b0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
37c0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
37d0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
37e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
37f0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3800: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3810: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3820: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3830: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3840: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3850: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3870: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38a0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
38b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
38c0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
38d0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
38e0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
38f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3900: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3910: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
3920: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3930: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3940: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3950: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3960: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3970: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3990: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
39a0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
39b0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
39c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
39d0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
39e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3a10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3a20: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3a30: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3a60: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3a70: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3a80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3a90: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3aa0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3ac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3ad0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3ae0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3af0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
3b00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
3b10: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3b20: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
3b30: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
3b40: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
3b50: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
3b60: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
3b70: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3b80: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
3b90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
3ba0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
3bb0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
3bc0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3bd0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
3be0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
3bf0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3c00: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
3c10: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
3c20: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
3c30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
3c40: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
3c50: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
3c60: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
3c70: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
3c80: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
3c90: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
3ca0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
3cc0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
3cd0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
3ce0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
3cf0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
3d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
3d10: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
3d20: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3d50: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
3d60: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3d80: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3d90: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3da0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3dd0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3e00: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3e30: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3e40: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3e50: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3e60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3e70: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3e80: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3e90: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3ea0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3eb0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3ec0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3ed0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3ee0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
3ef0: 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  s when INCRBLOB 
3f00: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3f10: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3f20: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3f30: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3f40: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3f50: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3f60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3f70: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
3f80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
3f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3fa0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
3fb0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
3fc0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
3fd0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
3fe0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
3ff0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4000: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4010: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4020: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4030: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4050: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4060: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4070: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
4080: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
4090: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
40a0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
40b0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
40c0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
40d0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
40e0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
40f0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4100: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4110: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4120: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4130: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4140: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4150: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4160: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4170: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
4180: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
4190: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
41a0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
41b0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
41c0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
41d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
41e0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
41f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4200: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4210: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4220: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4230: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4240: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4250: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4260: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4270: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
4280: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4290: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
42a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
42b0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
42c0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
42d0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
42e0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
42f0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4300: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4310: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4320: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4330: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4340: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4350: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4360: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4370: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
4380: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
4390: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43a0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
43b0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
43c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
43d0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
43e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
43f0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4400: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4410: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4420: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4430: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4440: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4460: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4470: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
4480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
4490: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
44a0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
44b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
44c0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
44d0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
44e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
44f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4510: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4520: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4530: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4540: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4550: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4560: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4570: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4580: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
4590: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
45a0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
45b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
45c0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
45d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
45e0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
45f0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4600: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4610: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4620: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4630: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4640: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4650: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4660: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4670: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4680: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4690: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
46a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
46b0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
46c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
46d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
46e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
46f0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4700: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4710: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4720: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4740: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4750: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4760: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4770: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
47a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
47b0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
47c0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
47e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
47f0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4800: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4810: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4830: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4840: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4850: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4860: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4870: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4880: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4890: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
48a0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
48b0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
48c0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
48d0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
48e0: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
48f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4900: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4910: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4920: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4940: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4950: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4960: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4970: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4980: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4990: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
49a0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
49b0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
49c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49d0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
49e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
49f0: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4a00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a10: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4a20: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4a30: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4a40: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4a50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4a70: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4a80: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4a90: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4aa0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4ab0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4ae0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4af0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4b00: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4b10: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4b20: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4b30: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
4b40: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
4b50: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4b60: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4b70: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4b80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4b90: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4ba0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4bb0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4bc0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4bd0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4bf0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4c00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4c20: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4c30: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4c50: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4c60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4c70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4c80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4c90: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4ca0: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4cb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4cc0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4cd0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4ce0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4cf0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4d00: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4d10: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4d20: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4d30: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4d40: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4d50: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4d60: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4d70: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4d80: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4d90: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4da0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4db0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4dc0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4dd0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4de0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4df0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4e00: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4e20: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4e30: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4e40: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4e50: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4e60: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4e70: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4e80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4e90: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4ea0: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4eb0: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4ee0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f10: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4f40: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4f50: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4f60: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4f70: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4f80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4fa0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4fb0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4fc0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4fd0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4fe0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4ff0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
5000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
5010: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5020: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
5030: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
5040: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
5050: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
5060: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
5070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5080: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5090: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
50a0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
50b0: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
50c0: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
50d0: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
50e0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
50f0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5100: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5110: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5120: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5130: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5140: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5150: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5180: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5190: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
51a0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
51b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
51c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
51d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
51e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
51f0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
5200: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
5210: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
5220: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
5230: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
5240: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5250: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5260: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5270: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5280: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5290: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
52a0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
52b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
52c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
52d0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
52e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
52f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5320: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5330: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5350: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5360: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5370: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5380: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5390: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
53a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
53b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
53c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
53d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
53e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
53f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5400: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5410: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5420: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5430: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5440: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5450: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5460: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5470: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5480: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5490: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
54a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
54c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
54d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
54e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
54f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5500: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5510: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5520: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5530: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5540: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5550: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5560: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5570: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5580: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5590: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
55a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
55b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
55c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
55d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
55e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
55f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5610: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5620: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5630: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5640: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5650: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5660: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5670: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5680: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5690: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
56a0: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
56b0: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
56c0: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
56d0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
56e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
56f0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5700: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5720: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5730: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5740: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5750: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5760: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5770: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
57a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
57b0: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
57c0: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
57d0: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
57e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
57f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5800: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5810: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5820: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5830: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
5840: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
5850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5860: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
5870: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
5880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
58a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
58c0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
58d0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
58e0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
58f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5900: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5910: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5920: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5930: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
5940: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
5950: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5960: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
5970: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
5980: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
5990: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59a0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
59b0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
59c0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
59e0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
59f0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a20: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5a40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5a70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5a80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5a90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5aa0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5ab0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ac0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5ae0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5af0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b00: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b30: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5b40: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5b50: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5b60: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5b90: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5bb0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5bc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5bd0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5be0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5bf0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c00: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c20: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5c40: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5c50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5c70: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5c80: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5c90: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5ca0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5cb0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5cc0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5cd0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5ce0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d10: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d30: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5d40: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5d50: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5d60: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5d70: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5d80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5da0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5db0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5dc0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5dd0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5de0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5df0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e00: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e10: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e20: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e30: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5e40: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5e50: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5e80: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ec0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5ed0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5ee0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5ef0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f10: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f20: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f30: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5f40: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5f50: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5f60: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5f70: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5f80: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5f90: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
5fa0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
5fb0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
5fc0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
5fd0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
5fe0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
5ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6000: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6010: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6020: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6040: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
6050: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6060: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
6070: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
6080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
60a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
60b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
60c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
60d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
60e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
60f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6100: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6110: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6120: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6130: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
6140: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
6150: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
6160: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
6170: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
6180: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
6190: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
61a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
61c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
61d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
61e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
61f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6200: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6210: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6220: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
6240: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
6250: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
6260: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
6270: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
6280: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
6290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
62a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
62b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
62c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
62d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
62e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
62f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6300: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6310: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6320: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
6340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
6370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
63a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
63b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
63c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
63d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
63e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
63f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6400: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6410: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6420: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6430: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
6440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6450: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6460: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
6470: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6480: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6490: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
64a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
64b0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
64c0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
64d0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
64e0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
64f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6510: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6520: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6540: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6550: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6560: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6570: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6580: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6590: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
65a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
65b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65c0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
65d0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
65e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
65f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6600: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6610: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6620: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6640: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6650: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
6660: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6670: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6680: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
6690: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
66a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
66b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
66c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
66d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
66e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
66f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6700: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6710: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6720: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6730: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
6740: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
6750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6760: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6790: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
67a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
67b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
67c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
67e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
67f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6800: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6810: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6820: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6830: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
6850: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
6860: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
6870: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
6880: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
6890: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
68a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
68b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
68c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
68d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
68e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
68f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6900: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6920: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6930: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6940: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
6950: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
6960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6970: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6980: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6990: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
69a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
69b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
69c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
69d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
69e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
69f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a10: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a20: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a30: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6a50: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6a60: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6a70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6a80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6aa0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6ab0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6ac0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6ae0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6af0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b10: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b20: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b30: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6b40: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6b50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6b60: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6b90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6ba0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6bd0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6be0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6bf0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c00: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c10: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c20: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c30: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6c40: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6c50: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6c60: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6ca0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6cc0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6cd0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6ce0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6cf0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d00: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d10: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d20: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d30: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6d40: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6d50: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6d60: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6d70: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6d80: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6da0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6db0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6dd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6df0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e00: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e10: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e20: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e30: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6e40: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6e50: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6e60: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6e70: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
6e80: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
6e90: 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c   findCellv2(D,M,
6ea0: 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62  O,I) (D+(M&get2b
6eb0: 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29  yte(D+(O+2*(I)))
6ec0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
6ed0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6ee0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6ef0: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6f00: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6f10: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6f20: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6f30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6f40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6f50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6f60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6f70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6f90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6fa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6fb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6fc0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6fd0: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
6fe0: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
6ff0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
7000: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
7010: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
7020: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
7030: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7040: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
7050: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
7060: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
7070: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
7080: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
7090: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
70a0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
70b0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
70c0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
70d0: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
70e0: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
70f0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
7100: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
7110: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
7120: 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43  on.  btreeParseC
7130: 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a  ell() takes a .*
7140: 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20  * cell index as 
7150: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
7160: 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72  ent and btreePar
7170: 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20  seCellPtr() .** 
7180: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
7190: 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74  to the body of t
71a0: 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73  he cell as its s
71b0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
71c0: 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69  **.** Within thi
71d0: 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73  s file, the pars
71e0: 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61  eCell() macro ca
71f0: 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  n be called inst
7200: 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50  ead of.** btreeP
7210: 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55  arseCellPtr(). U
7220: 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c  sing some compil
7230: 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ers, this will b
7240: 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61  e faster..*/.sta
7250: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
7260: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
7270: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7280: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7290: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
72a0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
72b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
72c0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
72d0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
72e0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
72f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
7300: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
7310: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e  re */.){.  u16 n
7320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7330: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74     /* Number byt
7340: 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65  es in cell conte
7350: 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  nt header */.  u
7360: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
7370: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7380: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
7390: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
73a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
73b0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
73c0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
73d0: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c  ..  pInfo->pCell
73e0: 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65   = pCell;.  asse
73f0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
7400: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
7410: 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50  f==1 );.  n = pP
7420: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
7430: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  e;.  assert( n==
7440: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  4-4*pPage->leaf 
7450: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
7460: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66  intKey ){.    if
7470: 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
7480: 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67   ){.      n += g
7490: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
74a0: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
74b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
74c0: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a    nPayload = 0;.
74d0: 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67      }.    n += g
74e0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
74f0: 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  n], (u64*)&pInfo
7500: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e  ->nKey);.    pIn
7510: 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79  fo->nData = nPay
7520: 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  load;.  }else{. 
7530: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
7540: 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  = 0;.    n += ge
7550: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7560: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7570: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20      pInfo->nKey 
7580: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a  = nPayload;.  }.
7590: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
75a0: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
75b0: 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d  pInfo->nHeader =
75c0: 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   n;.  testcase( 
75d0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
75e0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
75f0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
7600: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
7610: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69  al+1 );.  if( li
7620: 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70  kely(nPayload<=p
7630: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20  Page->maxLocal) 
7640: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
7650: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
7660: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
7670: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
7680: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
7690: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
76a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
76b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
76c0: 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66 6f  /.    if( (pInfo
76d0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28  ->nSize = (u16)(
76e0: 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20 29  n+nPayload))<4 )
76f0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
7700: 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  4;.    pInfo->nL
7710: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79  ocal = (u16)nPay
7720: 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  load;.    pInfo-
7730: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >iOverflow = 0;.
7740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7750: 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77  If the payload w
7760: 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70  ill not fit comp
7770: 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f  letely on the lo
7780: 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76  cal page, we hav
7790: 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69  e.    ** to deci
77a0: 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  de how much to s
77b0: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64  tore locally and
77c0: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69   how much to spi
77d0: 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f  ll onto.    ** o
77e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
77f0: 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20  The strategy is 
7800: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20  to minimize the 
7810: 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64  amount of unused
7820: 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e  .    ** space on
7830: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
7840: 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68  while keeping th
7850: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61  e amount of loca
7860: 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a  l storage.    **
7870: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
7880: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
7890: 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  l..    **.    **
78a0: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
78b0: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
78c0: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
78d0: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
78e0: 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69  ny.    ** way wi
78f0: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
7900: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
7910: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f  e format..    */
7920: 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61  .    int minLoca
7930: 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61  l;  /* Minimum a
7940: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
7950: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
7960: 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61  .    int maxLoca
7970: 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61  l;  /* Maximum a
7980: 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
7990: 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f   held locally */
79a0: 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73  .    int surplus
79b0: 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  ;   /* Overflow 
79c0: 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c  payload availabl
79d0: 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72  e for local stor
79e0: 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c  age */..    minL
79f0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
7a00: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c  nLocal;.    maxL
7a10: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
7a20: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70  xLocal;.    surp
7a30: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
7a40: 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e   (nPayload - min
7a50: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
7a60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
7a70: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
7a80: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7a90: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
7aa0: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
7ab0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
7ac0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
7ad0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7ae0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7af0: 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a  = (u16)surplus;.
7b00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7b10: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7b20: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
7b30: 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d      }.    pInfo-
7b40: 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31  >iOverflow = (u1
7b50: 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  6)(pInfo->nLocal
7b60: 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f   + n);.    pInfo
7b70: 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d  ->nSize = pInfo-
7b80: 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a  >iOverflow + 4;.
7b90: 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61    }.}.#define pa
7ba0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  rseCell(pPage, i
7bb0: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20  Cell, pInfo) \. 
7bc0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
7bd0: 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64  tr((pPage), find
7be0: 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69  Cell((pPage), (i
7bf0: 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29  Cell)), (pInfo))
7c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7c10: 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d  eeParseCell(.  M
7c20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
7c30: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
7c40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
7c50: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ll */.  int iCel
7c60: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7c70: 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65  /* The cell inde
7c80: 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69  x.  First cell i
7c90: 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  s 0 */.  CellInf
7ca0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
7cb0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
7cc0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
7cd0: 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  .  parseCell(pPa
7ce0: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7cf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  );.}../*.** Comp
7d00: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ute the total nu
7d10: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68  mber of bytes th
7d20: 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20  at a Cell needs 
7d30: 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64  in the cell.** d
7d40: 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20  ata area of the 
7d50: 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65  btree-page.  The
7d60: 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69   return number i
7d70: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c  ncludes the cell
7d80: 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20  .** data header 
7d90: 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61  and the local pa
7da0: 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61  yload, but not a
7db0: 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
7dc0: 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65   or.** the space
7dd0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c   used by the cel
7de0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
7df0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
7e00: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
7e10: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
7e20: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26  .  u8 *pIter = &
7e30: 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69  pCell[pPage->chi
7e40: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33  ldPtrSize];.  u3
7e50: 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66  2 nSize;..#ifdef
7e60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
7e70: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
7e80: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
7e90: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
7ea0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
7eb0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
7ec0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
7ed0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
7ee0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
7ef0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
7f00: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
7f10: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
7f20: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
7f30: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
7f40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
7f50: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
7f60: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
7f70: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
7f80: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
7f90: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
7fa0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
7fb0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
7fc0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
7fd0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
7fe0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b  ){.    u8 *pEnd;
7ff0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
8000: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
8010: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
8020: 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69  int32(pIter, nSi
8030: 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
8040: 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b        nSize = 0;
8050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70  .    }..    /* p
8060: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
8070: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
8080: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
8090: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
80a0: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
80b0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
80c0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
80d0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
80e0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
80f0: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
8100: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
8110: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
8120: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
8130: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
8140: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
8150: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73  r<pEnd );.  }els
8160: 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20  e{.    pIter += 
8170: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
8180: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  r, nSize);.  }..
8190: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
81a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
81b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
81c0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
81d0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
81e0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
81f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
8200: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20   int minLocal = 
8210: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8220: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e  .    nSize = min
8230: 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d  Local + (nSize -
8240: 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50   minLocal) % (pP
8250: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8260: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8270: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8280: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8290: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
82a0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
82b0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20  axLocal+1 );.   
82c0: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
82d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
82e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
82f0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
8300: 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a  nSize += 4;.  }.
8310: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
8320: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
8330: 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d  ..  /* The minim
8340: 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63  um size of any c
8350: 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20  ell is 4 bytes. 
8360: 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  */.  if( nSize<4
8370: 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   ){.    nSize = 
8380: 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  4;.  }..  assert
8390: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
83a0: 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65  fo.nSize );.  re
83b0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
83c0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
83d0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
83e0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
83f0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
8400: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
8410: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
8420: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
8430: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
8440: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8450: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
8460: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
8470: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
8480: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
8490: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
84a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
84b0: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
84c0: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
84d0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
84e0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
84f0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8500: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
8510: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
8520: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
8530: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
8540: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
8550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8560: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
8570: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8580: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
8590: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
85a0: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
85b0: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
85c0: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
85d0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
85e0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
85f0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
8600: 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
8610: 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
8620: 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
8630: 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
8640: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
8650: 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67  erflow ){.    Pg
8660: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
8670: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
8680: 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
8690: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
86a0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
86b0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
86c0: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
86d0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
86e0: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
86f0: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
8700: 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20    All Cells are 
8710: 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  moved to the.** 
8720: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20  end of the page 
8730: 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61  and all free spa
8740: 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20  ce is collected 
8750: 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20  into one.** big 
8760: 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63  FreeBlk that occ
8770: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74  urs in between t
8780: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65  he header and ce
8790: 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72  ll.** pointer ar
87a0: 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  ray and the cell
87b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a   content area..*
87c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
87d0: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
87e0: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
87f0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8810: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
8820: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
8830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
8840: 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63  ress of a i-th c
8850: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ell */.  int hdr
8860: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8870: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
8880: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
8890: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
88c0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
88d0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
88e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
88f0: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
8900: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
8910: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
8920: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
8930: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
8940: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
8950: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
8960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8970: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
8980: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
8990: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
89b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
89c0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
89d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
89e0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
89f0: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
8a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8a10: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
8a20: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
8a30: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
8a40: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8a60: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
8a70: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
8a80: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
8a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
8aa0: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
8ab0: 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73  index */...  ass
8ac0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
8ad0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
8ae0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
8af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8b00: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
8b10: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
8b20: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
8b30: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
8b40: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
8b50: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
8b60: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
8b70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8b80: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8b90: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
8ba0: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
8bb0: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
8bc0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
8bd0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
8be0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
8bf0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
8c00: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
8c10: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
8c20: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
8c30: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
8c40: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
8c50: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
8c60: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
8c70: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
8c80: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
8c90: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
8ca0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
8cb0: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
8cc0: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
8cd0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
8ce0: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
8cf0: 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c  bleSize;.  iCell
8d00: 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73  First = cellOffs
8d10: 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  et + 2*nCell;.  
8d20: 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
8d30: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f  leSize - 4;.  fo
8d40: 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
8d50: 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41  i++){.    u8 *pA
8d60: 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ddr;     /* The 
8d70: 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65  i-th cell pointe
8d80: 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d  r */.    pAddr =
8d90: 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65   &data[cellOffse
8da0: 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63  t + i*2];.    pc
8db0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
8dc0: 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
8dd0: 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc==iCellFirst
8de0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8df0: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
8e00: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
8e10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8e20: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8e30: 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20  K).    /* These 
8e40: 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20  conditions have 
8e50: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72  already been ver
8e60: 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e  ified in btreeIn
8e70: 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20  itPage().    ** 
8e80: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
8e90: 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
8ea0: 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20  HECK is defined 
8eb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ec0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
8ed0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
8ee0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8ef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8f00: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
8f10: 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d      assert( pc>=
8f20: 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63  iCellFirst && pc
8f30: 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  <=iCellLast );. 
8f40: 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69     size = cellSi
8f50: 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65  zePtr(pPage, &te
8f60: 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  mp[pc]);.    cbr
8f70: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64  k -= size;.#if d
8f80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8f90: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8fa0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66  LL_CHECK).    if
8fb0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
8fc0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
8fd0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8fe0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c  _BKPT;.    }.#el
8ff0: 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  se.    if( cbrk<
9000: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
9010: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
9020: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9030: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9040: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  BKPT;.    }.#end
9050: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  if.    assert( c
9060: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
9070: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
9080: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
9090: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
90a0: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
90b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
90c0: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
90d0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63  Size );.    memc
90e0: 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  py(&data[cbrk], 
90f0: 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29  &temp[pc], size)
9100: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
9110: 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d  Addr, cbrk);.  }
9120: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
9130: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9140: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
9150: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
9160: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
9170: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
9180: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
9190: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
91a0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
91b0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
91c0: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
91d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
91e0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
91f0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9200: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
9210: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
9220: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
9230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9240: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
9250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9260: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
9270: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
9280: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
9290: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
92a0: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
92b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
92c0: 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64   Write into *pId
92d0: 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f  x the index into
92e0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a   pPage->aData[].
92f0: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
9300: 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65  byte of allocate
9310: 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20  d space. Return 
9320: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b  either SQLITE_OK
9330: 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   or.** an error 
9340: 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51  code (usually SQ
9350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
9360: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
9370: 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
9380: 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69  there is suffici
9390: 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b  ent space to mak
93a0: 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e the.** allocat
93b0: 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ion.  This routi
93c0: 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  ne might need to
93d0: 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f   defragment in o
93e0: 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a  rder to bring.**
93f0: 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74   all the space t
9400: 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72  ogether, however
9410: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9420: 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67  will avoid using
9430: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77  .** the first tw
9440: 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65  o bytes past the
9450: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
9460: 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61  ea since presuma
9470: 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f  bly this.** allo
9480: 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  cation is being 
9490: 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  made in order to
94a0: 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   insert a new ce
94b0: 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a  ll, so we will.*
94c0: 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65  * also end up ne
94d0: 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c  eding a new cell
94e0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
94f0: 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
9500: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
9510: 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c  Page, int nByte,
9520: 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63   int *pIdx){.  c
9530: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
9540: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
9550: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
9560: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72  he of pPage->hdr
9570: 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a  Offset */.  u8 *
9580: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
9590: 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
95a0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
95b0: 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  of pPage->aData 
95c0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20  */.  int nFrag; 
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
95f0: 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65  ber of fragmente
9600: 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65  d bytes on pPage
9610: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9640: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
9650: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
9660: 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20  .  int gap;     
9670: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
9680: 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20   of gap between 
9690: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e  cell pointers an
96a0: 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a  d cell content *
96b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
96c0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
96d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
96e0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
96f0: 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
9700: 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
9710: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9720: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9730: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9740: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9750: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
9760: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9770: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9780: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9790: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
97a0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
97b0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
97c0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
97d0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
97e0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
97f0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
9800: 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53  ==0 );.  usableS
9810: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
9820: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
9830: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20  assert( nByte < 
9840: 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a  usableSize-8 );.
9850: 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b  .  nFrag = data[
9860: 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74  hdr+7];.  assert
9870: 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  ( pPage->cellOff
9880: 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20  set == hdr + 12 
9890: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20  - 4*pPage->leaf 
98a0: 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65  );.  gap = pPage
98b0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
98c0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
98d0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
98e0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
98f0: 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e  +5]);.  if( gap>
9900: 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c  top ) return SQL
9910: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9920: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9930: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
9940: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
9950: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
9960: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20  ( gap==top );.. 
9970: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29   if( nFrag>=60 )
9980: 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  {.    /* Always 
9990: 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c  defragment highl
99a0: 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67  y fragmented pag
99b0: 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64  es */.    rc = d
99c0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
99d0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
99e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
99f0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9a00: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
9a10: 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69  r+5]);.  }else i
9a20: 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  f( gap+2<=top ){
9a30: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
9a40: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
9a50: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
9a60: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
9a70: 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a  o satisfy .    *
9a80: 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54  * the request. T
9a90: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
9aa0: 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66   made from the f
9ab0: 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69  irst free slot i
9ac0: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69  n .    ** the li
9ad0: 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  st that is large
9ae0: 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d   enough to accom
9af0: 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f  adate it..    */
9b00: 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64  .    int pc, add
9b10: 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d  r;.    for(addr=
9b20: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
9b30: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
9b40: 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b  ]))>0; addr=pc){
9b50: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  .      int size;
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9b70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
9b80: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  slot */.      if
9b90: 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d  ( pc>usableSize-
9ba0: 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29  4 || pc<addr+4 )
9bb0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
9bc0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9bd0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
9be0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
9bf0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9c00: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65  ;.      if( size
9c10: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
9c20: 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20     int x = size 
9c30: 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  - nByte;.       
9c40: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20   testcase( x==4 
9c50: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
9c60: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
9c70: 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a       if( x<4 ){.
9c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
9c90: 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f  ove the slot fro
9ca0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
9cb0: 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62   Update the numb
9cc0: 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20  er of.          
9cd0: 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79  ** fragmented by
9ce0: 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  tes within the p
9cf0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
9d00: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
9d10: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
9d20: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
9d30: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38  ata[hdr+7] = (u8
9d40: 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20  )(nFrag + x);.  
9d50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9d60: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
9d70: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
9d80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9d90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9da0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9db0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
9dc0: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
9dd0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
9de0: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
9df0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
9e00: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72    ** for the por
9e10: 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65  tion used by the
9e20: 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   new allocation.
9e30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75   */.          pu
9e40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
9e50: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  2], x);.        
9e60: 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20  }.        *pIdx 
9e70: 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20  = pc + x;.      
9e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9e90: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
9ea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
9eb0: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
9ec0: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
9ed0: 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20  pace in the gap 
9ee0: 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20  to satisfy.  ** 
9ef0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  the allocation. 
9f00: 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d   If not, defragm
9f10: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ent..  */.  test
9f20: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
9f30: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
9f40: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
9f50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  ){.    rc = defr
9f60: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9f70: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9f80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9f90: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9fa0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9fb0: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
9fc0: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
9fd0: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
9fe0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
9ff0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
a000: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
a010: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
a020: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
a030: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
a040: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a050: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
a060: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
a070: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
a080: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
a090: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
a0a0: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
a0b0: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
a0c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
a0d0: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
a0e0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
a0f0: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
a100: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
a110: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
a120: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
a130: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
a140: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
a150: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
a160: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
a170: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
a180: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
a190: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
a1a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a1b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
a1c0: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
a1d0: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
a1e0: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
a1f0: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
a200: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
a210: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
a220: 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74  age->aDisk[start
a230: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
a240: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
a250: 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a  s "size" bytes..
a260: 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68  **.** Most of th
a270: 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73  e effort here is
a280: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61   involved in coa
a290: 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a  lesing adjacent.
a2a0: 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69  ** free blocks i
a2b0: 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67  nto a single big
a2c0: 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a   free block..*/.
a2d0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
a2e0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
a2f0: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
a300: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
a310: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
a320: 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b  dr;.  int iLast;
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a340: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
a350: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
a360: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
a370: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
a380: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
a390: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
a3a0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
a3b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a3c0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
a3d0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
a3e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
a3f0: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
a400: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
a410: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
a420: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61  ;.  assert( (sta
a430: 72 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69  rt + size) <= (i
a440: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
a450: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
a460: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a470: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
a480: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
a490: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
a4a0: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
a4b0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
a4c0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
a4d0: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
a4e0: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
a4f0: 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76  ETE ){.    /* Ov
a500: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
a510: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
a520: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
a530: 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20  secure_delete.  
a540: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
a550: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  nabled */.    me
a560: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
a570: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  ], 0, size);.  }
a580: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
a590: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
a5a0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
a5b0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  f freeblocks.  N
a5c0: 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76  ote that.  ** ev
a5d0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
a5e0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
a5f0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
a600: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a  eInitPage(),.  *
a610: 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  * btreeInitPage(
a620: 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74  ) did not detect
a630: 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c   overlapping cel
a640: 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62  ls or.  ** freeb
a650: 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c  locks that overl
a660: 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e  apped cells.   N
a670: 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  or does it detec
a680: 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  t when the.  ** 
a690: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a6a0: 61 20 65 78 63 65 65 64 73 20 74 68 65 20 76 61  a exceeds the va
a6b0: 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67 65 20  lue in the page 
a6c0: 68 65 61 64 65 72 2e 20 20 49 66 20 74 68 65 73  header.  If thes
a6d0: 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e  e.  ** situation
a6e0: 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75  s arise, then su
a6f0: 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20  bsequent insert 
a700: 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74  operations might
a710: 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68   corrupt.  ** th
a720: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20  e freelist.  So 
a730: 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68  we do need to ch
a740: 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69  eck for corrupti
a750: 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e  on while scannin
a760: 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c  g.  ** the freel
a770: 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ist..  */.  hdr 
a780: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
a790: 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72  et;.  addr = hdr
a7a0: 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20   + 1;.  iLast = 
a7b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a7c0: 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73  leSize - 4;.  as
a7d0: 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61  sert( start<=iLa
a7e0: 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  st );.  while( (
a7f0: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
a800: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c  e(&data[addr]))<
a810: 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e  start && pbegin>
a820: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65  0 ){.    if( pbe
a830: 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20  gin<addr+4 ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a850: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a860: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d      }.    addr =
a870: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69   pbegin;.  }.  i
a880: 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20  f( pbegin>iLast 
a890: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a8a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a8b0: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
a8c0: 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20   pbegin>addr || 
a8d0: 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70  pbegin==0 );.  p
a8e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  ut2byte(&data[ad
a8f0: 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70  dr], start);.  p
a900: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74  ut2byte(&data[st
a910: 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20  art], pbegin);. 
a920: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
a930: 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b  start+2], size);
a940: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
a950: 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b  = pPage->nFree +
a960: 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f   (u16)size;..  /
a970: 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63  * Coalesce adjac
a980: 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  ent free blocks 
a990: 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  */.  addr = hdr 
a9a0: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
a9b0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a9c0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
a9d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78   ){.    int pnex
a9e0: 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20  t, psize, x;.   
a9f0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
aa00: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
aa10: 72 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69  rt( pbegin <= (i
aa20: 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
aa30: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
aa40: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
aa50: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
aa60: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
aa70: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
aa80: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
aa90: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
aaa0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
aab0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
aac0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
aad0: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
aae0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
aaf0: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
ab00: 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  g>(int)data[hdr+
ab10: 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  7]) ){.        r
ab20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ab30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
ab40: 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64   }.      data[hd
ab50: 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67  r+7] -= (u8)frag
ab60: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
ab70: 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74  byte(&data[pnext
ab80: 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ]);.      put2by
ab90: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
aba0: 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20  , x);.      x = 
abb0: 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65  pnext + get2byte
abc0: 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29  (&data[pnext+2])
abd0: 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20   - pbegin;.     
abe0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
abf0: 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20  pbegin+2], x);. 
ac00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ac10: 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20  addr = pbegin;. 
ac20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
ac30: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ac40: 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77  nt area begins w
ac50: 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c  ith a freeblock,
ac60: 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   remove it. */. 
ac70: 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d   if( data[hdr+1]
ac80: 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26  ==data[hdr+5] &&
ac90: 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61   data[hdr+2]==da
aca0: 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20  ta[hdr+6] ){.   
acb0: 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62   int top;.    pb
acc0: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
acd0: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
ace0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
acf0: 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62  hdr+1], &data[pb
ad00: 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74  egin], 2);.    t
ad10: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  op = get2byte(&d
ad20: 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65  ata[hdr+5]) + ge
ad30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ad40: 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74  gin+2]);.    put
ad50: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ad60: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20  5], top);.  }.  
ad70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ad80: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
ad90: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
adb0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
adc0: 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73  Decode the flags
add0: 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74   byte (the first
ade0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61   byte of the hea
adf0: 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a  der) for a page.
ae00: 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
ae10: 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  e fields of the 
ae20: 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
ae30: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  e accordingly..*
ae40: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f  *.** Only the fo
ae50: 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
ae60: 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74  ions are support
ae70: 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69  ed.  Anything di
ae80: 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63  fferent.** indic
ae90: 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64  ates a corrupt d
aea0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a  atabase files:.*
aeb0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  *.**         PTF
aec0: 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20  _ZERODATA.**    
aed0: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
aee0: 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20  A | PTF_LEAF.** 
aef0: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
af00: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
af10: 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  Y.**         PTF
af20: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
af30: 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41  INTKEY | PTF_LEA
af40: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
af50: 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50  decodeFlags(MemP
af60: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
af70: 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53  flagByte){.  BtS
af80: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
af90: 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61  /* A copy of pPa
afa0: 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73  ge->pBt */..  as
afb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72  sert( pPage->hdr
afc0: 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e  Offset==(pPage->
afd0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
afe0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
aff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b000: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b010: 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
b020: 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c  ->leaf = (u8)(fl
b030: 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73  agByte>>3);  ass
b040: 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d  ert( PTF_LEAF ==
b050: 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42   1<<3 );.  flagB
b060: 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46  yte &= ~PTF_LEAF
b070: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ;.  pPage->child
b080: 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50  PtrSize = 4-4*pP
b090: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74  age->leaf;.  pBt
b0a0: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
b0b0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
b0c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
b0d0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
b0e0: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
b0f0: 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 1;.    pPage->
b100: 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d  hasData = pPage-
b110: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
b120: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
b130: 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70  ->maxLeaf;.    p
b140: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
b150: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20   pBt->minLeaf;. 
b160: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42   }else if( flagB
b170: 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54  yte==PTF_ZERODAT
b180: 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  A ){.    pPage->
b190: 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  intKey = 0;.    
b1a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b1b0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   0;.    pPage->m
b1c0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b1d0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61  axLocal;.    pPa
b1e0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
b1f0: 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  Bt->minLocal;.  
b200: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
b210: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b220: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
b230: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
b240: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
b250: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
b260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b270: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b280: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
b290: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
b2a0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
b2b0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b2c0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b2d0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b2e0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b2f0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
b300: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
b310: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
b320: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
b330: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
b340: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
b350: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
b360: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
b370: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
b380: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
b390: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
b3a0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
b3b0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
b3c0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
b3d0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
b3e0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
b3f0: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
b400: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b410: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b420: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b430: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b440: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b450: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
b460: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
b470: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
b480: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b490: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
b4a0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b4b0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b4c0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b4d0: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
b4e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
b4f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
b500: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
b510: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
b520: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
b530: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b540: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b550: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b560: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
b570: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
b580: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
b590: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
b5a0: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
b5b0: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
b5c0: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
b5d0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
b5e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
b5f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
b600: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
b610: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
b620: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
b630: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
b640: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
b650: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
b660: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
b670: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
b680: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
b690: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
b6a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
b6b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
b6c0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
b6d0: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
b6e0: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
b6f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b700: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
b710: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b720: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
b730: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
b740: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b750: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b760: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
b770: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b780: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b790: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b7a0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
b7b0: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
b7c0: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
b7d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b7e0: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
b7f0: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
b800: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
b810: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
b820: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b830: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b840: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
b850: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b860: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b870: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
b880: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
b890: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
b8a0: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
b8b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
b8c0: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
b8d0: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
b8e0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
b8f0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
b900: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
b910: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
b920: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
b930: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
b940: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
b950: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
b960: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b970: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
b980: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b990: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b9a0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
b9b0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b9c0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
b9d0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
b9e0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
b9f0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
ba00: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
ba10: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
ba20: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
ba30: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
ba40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ba50: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
ba60: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
ba70: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
ba80: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
ba90: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
baa0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
bab0: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
bac0: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
bad0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
bae0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
baf0: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
bb00: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
bb10: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
bb20: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
bb30: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
bb40: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
bb50: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
bb60: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
bb70: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
bb80: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
bb90: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
bba0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
bbb0: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
bbc0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
bbd0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
bbe0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
bbf0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
bc00: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
bc10: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
bc20: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
bc30: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bc50: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
bc60: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bc70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
bc80: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
bc90: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
bca0: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
bcb0: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
bcc0: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
bcd0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bce0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bcf0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
bd00: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
bd10: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
bd20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bd30: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bd40: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
bd50: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bd60: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bd70: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bd80: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bd90: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
bda0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bdb0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
bdc0: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
bdd0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
bde0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bdf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
be00: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
be10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
be20: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
be30: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
be40: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
be50: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
be60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
be70: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
be80: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
be90: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bea0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
beb0: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bec0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bed0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bee0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bef0: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
bf00: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bf10: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
bf20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
bf30: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
bf40: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bf50: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bf60: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
bf70: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
bf80: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
bf90: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
bfa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bfb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bfc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
bfd0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bfe0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
bff0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c000: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c010: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
c020: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c030: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
c040: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c050: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c060: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
c070: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
c080: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
c090: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
c0a0: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
c0b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
c0c0: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
c0d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c0e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
c100: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
c110: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
c120: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c130: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
c140: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
c150: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
c160: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c170: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
c180: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c190: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
c1a0: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c1b0: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
c1c0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c1d0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
c1e0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c1f0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
c200: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
c210: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
c220: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c230: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c240: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c250: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c260: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c270: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c280: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c290: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c2a0: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c2b0: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c2c0: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c2d0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c2e0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c2f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c300: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c310: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c320: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c330: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c340: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c350: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c360: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c370: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c380: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c390: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c3a0: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c3b0: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c3c0: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c3d0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c3e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c3f0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c400: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c410: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c420: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c430: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c440: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c450: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c460: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c470: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c480: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c490: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c4a0: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c4b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c4c0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c4d0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c4e0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c4f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c500: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c510: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c520: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c530: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c540: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c550: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c560: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c570: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c580: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c590: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
c5a0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
c5b0: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
c5c0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c5d0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c5e0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c5f0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c600: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c610: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c620: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c630: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c640: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c650: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c660: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c670: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c680: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c690: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c6a0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
c6b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c6c0: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
c6d0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
c6e0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
c6f0: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
c700: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c710: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
c720: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
c730: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
c740: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
c750: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
c760: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
c770: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c780: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c790: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c7a0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c7b0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
c7c0: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
c7d0: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
c7e0: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
c7f0: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
c800: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
c810: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
c820: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
c830: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
c840: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
c850: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
c860: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
c870: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c880: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
c890: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
c8a0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
c8b0: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
c8c0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
c8d0: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
c8e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c8f0: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
c900: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
c910: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c920: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
c930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
c940: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
c950: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
c960: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
c970: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
c980: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
c990: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
c9a0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
c9b0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
c9c0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
c9d0: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
c9e0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
c9f0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ca00: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ca10: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
ca20: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
ca30: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
ca40: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
ca50: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
ca60: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
ca70: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
ca80: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
ca90: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
caa0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
cab0: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
cac0: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
cad0: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
cae0: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
caf0: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
cb00: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
cb10: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
cb20: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
cb30: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
cb40: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
cb50: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
cb60: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
cb70: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
cb80: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
cb90: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
cba0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
cbb0: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
cbc0: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
cbd0: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
cbe0: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
cbf0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
cc00: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
cc10: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cc20: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
cc30: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
cc40: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
cc50: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
cc60: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
cc70: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
cc80: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
cc90: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
cca0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
ccb0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
ccc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ccd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ccf0: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
cd00: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
cd10: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
cd20: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
cd30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
cd40: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
cd50: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
cd60: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
cd70: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
cd80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cd90: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
cda0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
cdb0: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
cdc0: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
cdd0: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
cde0: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
cdf0: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
ce00: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
ce10: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
ce20: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
ce30: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
ce40: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
ce50: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
ce60: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
ce70: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
ce80: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
ce90: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
cea0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
ceb0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cec0: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
ced0: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
cee0: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
cef0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
cf00: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
cf10: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
cf20: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cf30: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
cf40: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cf50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
cf60: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
cf70: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
cf80: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
cf90: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
cfa0: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
cfb0: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
cfc0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
cfd0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
cfe0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
cff0: 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
d000: 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
d010: 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
d020: 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
d030: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
d040: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
d050: 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
d060: 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
d070: 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
d080: 74 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50  turn (int)btreeP
d090: 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
d0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
d0b0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
d0c0: 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
d0d0: 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ize it.  This ro
d0e0: 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a  utine is just a.
d0f0: 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77  ** convenience w
d100: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65  rapper around se
d110: 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20  parate calls to 
d120: 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  btreeGetPage() a
d130: 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74  nd .** btreeInit
d140: 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
d150: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d160: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
d170: 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
d180: 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  to is undefined.
d190: 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
d1a0: 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
d1b0: 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
d1c0: 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
d1d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d1e0: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
d1f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d200: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
d210: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d220: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d240: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d250: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d260: 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20  age **ppPage    
d270: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d280: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
d290: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d2a0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d2b0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d2c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
d2d0: 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
d2e0: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
d2f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
d300: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
d310: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62  else{.    rc = b
d320: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
d330: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
d340: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d350: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d360: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
d370: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
d380: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d3a0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
d3b0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
d3c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73      }.  }..  tes
d3d0: 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
d3e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
d3f0: 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
d400: 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
d410: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d420: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d430: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d440: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d450: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d460: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d470: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d480: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d490: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d4a0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d4b0: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d4c0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
d4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d4e0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
d4f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d500: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
d510: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
d520: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
d530: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d540: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d550: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
d560: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d570: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d5b0: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
d5c0: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
d5d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
d5e0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
d5f0: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
d600: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
d610: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
d620: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
d630: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
d640: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d650: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
d660: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
d670: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
d680: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
d690: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d6a0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d6b0: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
d6c0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
d6d0: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
d6e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d6f0: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
d700: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d710: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
d720: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
d730: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
d740: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
d750: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
d760: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d770: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d780: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
d790: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d7a0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d7b0: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
d7c0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
d7d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d7e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d7f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d800: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
d810: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
d820: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
d830: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d840: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
d850: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
d860: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
d870: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
d880: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
d890: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
d8a0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
d8b0: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
d8c0: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
d8d0: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
d8e0: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
d8f0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
d900: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
d910: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
d920: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
d930: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
d940: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
d950: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
d960: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
d970: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
d980: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
d990: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
d9a0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
d9b0: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
d9c0: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
d9d0: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
d9e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
d9f0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
da00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
da10: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
da20: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
da30: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
da40: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
da50: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
da60: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
da70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
da80: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
da90: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
daa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
dab0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
dac0: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
dad0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
dae0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
daf0: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
db00: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
db10: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
db20: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
db30: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
db40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
db50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
db60: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
db70: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
db80: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
db90: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
dba0: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
dbb0: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
dbc0: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
dbd0: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
dbe0: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
dbf0: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
dc00: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
dc10: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
dc20: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
dc30: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
dc40: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
dc50: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
dc60: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
dc70: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
dc80: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
dc90: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
dca0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
dcb0: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
dcc0: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
dcd0: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
dce0: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
dcf0: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
dd00: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
dd10: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
dd20: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 0a 2a  t contain bits.*
dd30: 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
dd40: 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
dd50: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 2e 20 20  E_NO_READLOCK.  
dd60: 54 68 65 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41  The BTREE_NO_REA
dd70: 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74 20 69 73 20  DLOCK.** bit is 
dd80: 61 6c 73 6f 20 73 65 74 20 69 66 20 74 68 65 20  also set if the 
dd90: 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63  SQLITE_NoReadloc
dda0: 6b 20 66 6c 61 67 73 20 69 73 20 73 65 74 20 69  k flags is set i
ddb0: 6e 20 64 62 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20  n db->flags..** 
ddc0: 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
ddd0: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 69  passed through i
dde0: 6e 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  nto sqlite3Pager
ddf0: 4f 70 65 6e 28 29 20 61 6e 64 20 6d 75 73 74 0a  Open() and must.
de00: 2a 2a 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  ** be the same v
de10: 61 6c 75 65 73 20 61 73 20 50 41 47 45 52 5f 4f  alues as PAGER_O
de20: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
de30: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
de40: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
de50: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
de60: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
de70: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
de80: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
de90: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
dea0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
deb0: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
dec0: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
ded0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
dee0: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
def0: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
df00: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
df10: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
df20: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
df30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
df40: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
df50: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
df60: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
df70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
df80: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
df90: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
dfa0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
dfb0: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
dfc0: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
dfd0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
dfe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
dff0: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e000: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e010: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e020: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e030: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e040: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e050: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e060: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e070: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e080: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e090: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e0a0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e0b0: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e0c0: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e0e0: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e0f0: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e100: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e110: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e120: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e130: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e140: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e150: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e170: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e180: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e190: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e1a0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e1b0: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e1c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e1d0: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e1e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e1f0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e200: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e210: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e220: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e240: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e250: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e260: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e270: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e280: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e290: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e2a0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e2b0: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e2c0: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e2d0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e2e0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e2f0: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e300: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e310: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e320: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e330: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e340: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e350: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e360: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e370: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e380: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e390: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e3a0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e3b0: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e3c0: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e3d0: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e3e0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e3f0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e400: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e420: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e430: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e440: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a  pInMemory(db));.
e450: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e460: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
e470: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
e480: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e490: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
e4a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e4b0: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
e4c0: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
e4d0: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
e4e0: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
e4f0: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
e500: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
e510: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
e520: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
e530: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
e540: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
e550: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
e560: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
e570: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
e580: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
e590: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
e5a0: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
e5b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e5c0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e5d0: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
e5e0: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  pDb );..  if( db
e5f0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e600: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
e610: 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
e620: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  E_NO_READLOCK;. 
e630: 20 7d 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62   }.  if( isMemdb
e640: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e650: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
e660: 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
e670: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e680: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
e690: 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
e6a0: 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
e6b0: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
e6c0: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
e6d0: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
e6e0: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
e6f0: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
e700: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
e710: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
e720: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
e730: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e740: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
e750: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
e760: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
e770: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e780: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e790: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
e7a0: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
e7b0: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
e7c0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
e7d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e7e0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e7f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e800: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
e810: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
e820: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
e830: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
e840: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
e850: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
e860: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
e870: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
e880: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
e890: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
e8a0: 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 29 7b 0a   isTempDb==0 ){.
e8b0: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e8c0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e8d0: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e8e0: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e8f0: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e900: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e910: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e920: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e930: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e940: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
e950: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
e960: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
e970: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
e980: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
e990: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
e9a0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
e9b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e9c0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
e9d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e9e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
e9f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ea00: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
ea10: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
ea20: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
ea30: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  thname);.      i
ea40: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
ea50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
ea60: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ea70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ea80: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
ea90: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
eaa0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
eab0: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
eac0: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
ead0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
eae0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
eaf0: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
eb00: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eb10: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
eb20: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
eb30: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
eb40: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
eb50: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
eb60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
eb70: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
eb80: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
eb90: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
eba0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ebb0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ebc0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
ebd0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
ebe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
ebf0: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ec00: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ec10: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
ec20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ec30: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ec40: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
ec50: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
ec60: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
ec70: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
ec80: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
ec90: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
eca0: 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
ecb0: 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
ecc0: 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
ecd0: 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
ece0: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
ed00: 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
ed10: 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
ed20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ed30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ed40: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
ed50: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ed60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ed70: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
ed80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ed90: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
eda0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
edb0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
edc0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
edd0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ede0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
edf0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
ee00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ee10: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
ee20: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
ee30: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
ee40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ee50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ee60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ee70: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
ee80: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
ee90: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
eea0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
eeb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
eec0: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
eed0: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
eee0: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
eef0: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
ef00: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
ef10: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
ef20: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
ef30: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
ef40: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
ef50: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
ef60: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
ef70: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
ef80: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
ef90: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
efa0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
efb0: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
efc0: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
efd0: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
efe0: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
eff0: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
f000: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
f010: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
f020: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
f030: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
f040: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
f050: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
f060: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
f070: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
f080: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
f090: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
f0a0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
f0b0: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
f0c0: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
f0d0: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
f0e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f0f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
f100: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
f110: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f120: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
f130: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
f140: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f150: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
f160: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f170: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
f180: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
f190: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
f1a0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
f1b0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
f1c0: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
f1d0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
f1e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f1f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f200: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f210: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f230: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
f240: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
f250: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
f280: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
f290: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
f2a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f2b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f2c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
f2d0: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
f2e0: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
f2f0: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
f300: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
f310: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f320: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f330: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
f340: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
f350: 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
f360: 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
f370: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
f380: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
f390: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
f3a0: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
f3b0: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
f3c0: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
f3d0: 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
f3e0: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
f3f0: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
f400: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
f410: 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
f420: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
f430: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
f440: 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
f450: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
f460: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  CURE_DELETE.    
f470: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
f480: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
f490: 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  TE;.#endif.    p
f4a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f4b0: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f4c0: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f4d0: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f4e0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f4f0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f500: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f510: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f520: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f530: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f540: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f550: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f560: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f570: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f580: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f590: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f5a0: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f5b0: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f5c0: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f5d0: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f5e0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f5f0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f600: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f610: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f620: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f630: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f640: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f650: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f660: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f670: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f680: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f690: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f6a0: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f6b0: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f6c0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f6d0: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f6e0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f6f0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f700: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f710: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f720: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f730: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f740: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f750: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f760: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f770: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f780: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f790: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f7a0: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f7b0: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f7c0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f7d0: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f7e0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f7f0: 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
f800: 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
f810: 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
f820: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f830: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
f840: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
f850: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
f860: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
f870: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
f880: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
f890: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
f8a0: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
f8b0: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
f8c0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f8d0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
f8e0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
f8f0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
f900: 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
f910: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
f920: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
f930: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
f940: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
f950: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
f960: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
f970: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
f980: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
f990: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
f9a0: 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
f9b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f9c0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f9d0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
f9e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
f9f0: 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
fa00: 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
fa10: 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
fa20: 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
fa30: 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
fa40: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
fa50: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
fa60: 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
fa70: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
fa80: 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
fa90: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
faa0: 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
fab0: 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
fac0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fad0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fae0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
faf0: 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
fb00: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
fb10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
fb20: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
fb30: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
fb40: 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
fb50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
fb60: 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
fb70: 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
fb80: 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
fb90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fba0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
fbb0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
fbc0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
fbd0: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
fbe0: 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
fbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
fc00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fc10: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
fc20: 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
fc30: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
fc40: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
fc50: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
fc60: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
fc70: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
fc80: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
fc90: 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
fca0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
fcb0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fcc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
fcd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
fce0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fcf0: 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
fd00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
fd10: 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
fd20: 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
fd30: 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
fd40: 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
fd50: 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
fd60: 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
fd70: 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
fd80: 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
fd90: 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
fda0: 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
fdb0: 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
fdc0: 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
fdd0: 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
fde0: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
fdf0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
fe00: 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
fe10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
fe20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
fe30: 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
fe40: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
fe50: 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
fe60: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
fe70: 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
fe80: 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
fe90: 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
fea0: 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
feb0: 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
fec0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
fed0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
fee0: 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
fef0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ff00: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
ff10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ff20: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
ff30: 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
ff40: 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
ff50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ff60: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
ff70: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
ff80: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
ff90: 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
ffa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
ffb0: 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
ffc0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
ffd0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
ffe0: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
fff0: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
10000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
10010 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
10020 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10030 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10040 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
10050 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
10060 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
10070 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
10080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
10090 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
100a0 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
100b0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
100c0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
100d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
100e0 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
100f0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10100 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
10110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
10120 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
10130 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
10140 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
10150 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10160 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
10170 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
10180 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
10190 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
101a0 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
101b0 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
101c0 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
101d0 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
101e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
101f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
10200 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
10210 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10220 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
10230 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
10240 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10250 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
10260 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
10270 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
10280 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10290 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
102a0 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
102b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
102c0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
102d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
102e0 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
102f0 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
10300 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
10310 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
10320 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
10330 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
10340 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
10350 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
10360 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
10370 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
10380 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
10390 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
103a0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
103b0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
103c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
103d0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
103e0 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
103f0 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
10400 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10410 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
10420 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
10430 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
10440 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
10450 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
10460 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
10470 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
10480 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10490 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
104a0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
104b0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
104c0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
104d0 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
104e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
104f0 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
10500 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
10510 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
10520 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
10530 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
10540 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
10550 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
10560 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10570 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10580 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
10590 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
105a0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
105b0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
105c0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
105d0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
105e0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
105f0 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
10600 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
10610 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
10620 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
10630 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
10640 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
10650 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
10660 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
10670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10680 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
10690 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
106a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
106b0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
106c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
106d0 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
106e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
106f0 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
10700 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
10710 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
10720 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
10730 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
10740 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
10750 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
10760 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
10770 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
10780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10790 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
107a0 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
107b0 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
107c0 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
107d0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
107e0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
107f0 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
10800 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
10810 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
10820 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
10830 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
10840 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
10850 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10860 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
10870 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
10880 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
10890 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
108a0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
108b0 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
108c0 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
108d0 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
108e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
108f0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
10900 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10910 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
10920 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
10930 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
10940 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
10950 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
10960 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10970 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10980 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10990 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
109a0 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
109b0 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
109c0 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
109d0 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
109e0 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
109f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
10a00 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
10a10 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
10a20 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
10a30 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
10a40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
10a50 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
10a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
10a70 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
10a80 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
10a90 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
10aa0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10ab0 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
10ac0 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
10ad0 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
10ae0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
10af0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
10b00 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
10b10 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
10b20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
10b30 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
10b40 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
10b50 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
10b60 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
10b70 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
10b80 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
10b90 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
10ba0 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
10bb0 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
10bc0 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
10bd0 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
10be0 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
10bf0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
10c00 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
10c10 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
10c20 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
10c30 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
10c40 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
10c50 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
10c60 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
10c70 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
10c80 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
10c90 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
10ca0 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
10cb0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
10cc0 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
10cd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10ce0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
10cf0 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
10d00 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10d10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10d20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10d30 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
10d40 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
10d50 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
10d60 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
10d70 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
10d80 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
10d90 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
10da0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
10db0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10dc0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
10dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10de0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
10df0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10e00 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
10e10 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
10e20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
10e30 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
10e40 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
10e50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
10e60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10e70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
10e80 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
10e90 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
10ea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10eb0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
10ec0 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
10ed0 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
10ee0 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
10ef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
10f00 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
10f10 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
10f20 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
10f30 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
10f40 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
10f50 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10f60 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
10f70 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
10f80 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
10f90 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
10fa0 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
10fb0 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
10fc0 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
10fd0 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
10fe0 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
10ff0 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
11000 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
11010 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
11020 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
11030 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
11040 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
11050 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
11060 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
11070 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
11080 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
11090 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
110a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
110b0 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
110c0 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
110d0 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
110e0 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
110f0 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
11100 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
11110 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
11120 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
11130 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
11140 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
11150 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
11160 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
11170 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
11180 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
11190 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
111a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
111b0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
111c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
111d0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
111e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
111f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
11200 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
11210 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
11220 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
11230 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11240 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
11250 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11260 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
11270 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
11280 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
11290 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
112a0 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
112b0 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
112c0 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
112d0 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
112e0 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
112f0 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
11300 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
11310 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
11320 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
11330 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
11340 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
11350 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
11360 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
11370 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
11380 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
11390 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
113a0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
113b0 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
113c0 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
113d0 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
113e0 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
113f0 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
11400 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
11410 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
11420 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
11430 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
11440 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
11450 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42 74  afetyLevel(.  Bt
11460 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
11470 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
11480 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
11490 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
114a0 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
114b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47           /* PRAG
114c0 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20  MA synchronous. 
114d0 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c   1=OFF, 2=NORMAL
114e0 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69 6e  , 3=FULL */.  in
114f0 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20  t fullSync,     
11500 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
11510 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20 69  ullfsync. */.  i
11520 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20  nt ckptFullSync 
11530 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
11540 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
11550 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ync */.){.  BtSh
11560 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11570 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11580 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11590 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
115a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  ;.  assert( leve
115b0 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
115c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
115d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
115e0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
115f0 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50  etyLevel(pBt->pP
11600 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c  ager, level, ful
11610 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c 53  lSync, ckptFullS
11620 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
11630 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11650 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11660 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11670 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
11680 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
11690 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
116a0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
116b0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
116c0 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
116d0 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
116e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
116f0 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
11700 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
11710 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
11720 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
11730 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11740 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
11750 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
11760 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11770 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
11780 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
11790 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
117a0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
117b0 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
117c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
117d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
117e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
117f0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
11800 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
11810 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
11820 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
11830 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
11840 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
11850 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11860 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
11870 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11880 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11890 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
118a0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
118b0 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
118c0 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
118d0 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
118e0 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
118f0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
11900 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
11910 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
11920 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
11930 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
11940 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
11950 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11960 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11970 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11980 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119a0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
119b0 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
119c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
119d0 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
119e0 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
119f0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
11a00 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
11a10 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
11a20 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
11a30 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
11a40 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
11a50 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11a60 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11a70 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11a80 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11a90 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
11ab0 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
11ac0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
11ad0 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
11ae0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
11af0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
11b00 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
11b10 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
11b20 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
11b30 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
11b40 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
11b50 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
11b60 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
11b70 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
11b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
11b90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11ba0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
11bb0 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
11bc0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
11bd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11be0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
11bf0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
11c00 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
11c10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
11c20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11c40 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
11c50 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
11c60 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
11c70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
11c80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11c90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
11ca0 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
11cb0 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
11cc0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
11cd0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
11ce0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
11cf0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
11d00 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
11d10 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
11d20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11d30 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11d40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
11d50 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
11d60 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
11d70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
11d80 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
11d90 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11da0 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
11db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
11dc0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
11dd0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
11de0 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
11df0 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
11e00 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
11e10 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
11e20 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
11e30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
11e40 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
11e50 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
11e60 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
11e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11e80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11e90 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
11ea0 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
11eb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11ec0 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
11ed0 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
11ee0 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
11ef0 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
11f00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
11f10 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
11f20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11f30 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
11f40 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11f50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
11f60 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
11f70 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
11f80 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
11f90 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
11fa0 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
11fb0 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
11fc0 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
11fd0 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
11fe0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
11ff0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12000 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
12010 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
12020 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12030 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
12040 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12050 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12060 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
12070 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12080 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
12090 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
120a0 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
120b0 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
120c0 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
120d0 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
120e0 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
120f0 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
12100 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
12110 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
12120 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
12130 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
12140 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
12150 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
12160 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
12170 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
12180 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
12190 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
121a0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
121b0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
121c0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
121d0 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
121e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
121f0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
12200 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
12210 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
12220 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
12230 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
12240 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
12250 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
12260 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
12270 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
12280 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
12290 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
122a0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
122b0 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
122c0 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
122d0 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
122e0 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
122f0 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
12300 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
12310 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12320 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
12330 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
12340 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
12350 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
12360 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
12370 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
12380 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
12390 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
123a0 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
123b0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
123c0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
123d0 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
123e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
123f0 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
12400 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
12410 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
12420 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
12430 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12440 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
12450 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
12460 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
12470 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
12480 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
12490 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
124a0 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
124b0 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
124c0 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
124d0 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
124e0 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
124f0 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
12500 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
12510 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
12520 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
12530 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
12540 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
12550 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
12560 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
12570 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
12580 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
12590 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
125a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
125b0 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
125c0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
125d0 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
125e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
125f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12600 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
12610 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
12620 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12630 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
12640 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
12650 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
12660 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
12670 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
12680 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
12690 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
126a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
126b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
126c0 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
126d0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
126e0 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
126f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12700 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12710 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
12720 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
12730 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
12740 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12750 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
12760 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
12770 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
12780 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
12790 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
127a0 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
127b0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
127c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
127d0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
127e0 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
127f0 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
12800 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12810 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12820 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
12830 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
12840 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12850 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
12860 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
12870 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
12880 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
12890 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
128a0 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
128b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
128c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
128d0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
128e0 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
128f0 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
12900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12910 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
12920 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
12930 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
12940 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
12950 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
12960 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
12970 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
12980 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
12990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
129a0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
129b0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
129c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
129d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
129e0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
129f0 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
12a00 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
12a10 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
12a20 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
12a30 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
12a40 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
12a50 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12a70 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12a80 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
12a90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
12aa0 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
12ab0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
12ac0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
12ad0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
12ae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
12af0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
12b00 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
12b10 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
12b20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12b30 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12b40 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12b50 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
12b60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
12b70 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
12b80 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
12b90 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
12ba0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12bb0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
12bc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
12bd0 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
12be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
12bf0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
12c00 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
12c10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
12c30 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
12c40 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
12c50 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
12c60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12c70 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
12c80 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
12c90 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
12ca0 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
12cb0 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
12cc0 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
12cd0 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
12ce0 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
12cf0 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
12d00 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
12d10 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
12d20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
12d30 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
12d40 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
12d50 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
12d60 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
12d70 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
12d80 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
12d90 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
12da0 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
12db0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
12dc0 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
12dd0 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
12de0 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
12df0 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
12e00 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
12e10 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
12e20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61     if( memcmp(pa
12e30 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ge1, zMagicHeade
12e40 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20  r, 16)!=0 ){.   
12e50 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12e60 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12e70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12e80 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28  OMIT_WAL.    if(
12e90 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
12ea0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
12eb0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
12ec0 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
12ed0 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20  if( page1[19]>1 
12ee0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12ef0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12f00 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
12f10 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32   if( page1[18]>2
12f20 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62   ){.      pBt->b
12f30 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
12f40 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  EAD_ONLY;.    }.
12f50 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
12f60 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>2 ){.      got
12f70 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
12f80 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
12f90 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20  /* If the write 
12fa0 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74  version is set t
12fb0 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61  o 2, this databa
12fc0 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63  se should be acc
12fd0 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  essed.    ** in 
12fe0 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  WAL mode. If the
12ff0 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65   log is not alre
13000 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69  ady open, open i
13010 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20  t now. Then .   
13020 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
13030 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20  E_OK and return 
13040 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69  without populati
13050 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67  ng BtShared.pPag
13060 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  e1..    ** The c
13070 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68  aller detects th
13080 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69  is and calls thi
13090 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
130a0 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a  . This is.    **
130b0 20 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65   required as the
130c0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
130d0 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20   1 currently in 
130e0 74 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72  the page1 buffer
130f0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
13100 62 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65  be the latest ve
13110 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61  rsion - there ma
13120 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65  y be a newer one
13130 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20   in the log.    
13140 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ** file..    */.
13150 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
13160 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74  ]==2 && (pBt->bt
13170 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f  sFlags & BTS_NO_
13180 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  WAL)==0 ){.     
13190 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
131a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
131b0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
131c0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
131d0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
131e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
131f0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
13200 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13210 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13220 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
13230 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
13240 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
13250 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13260 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13280 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
13290 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
132a0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
132b0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
132c0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
132d0 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
132e0 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
132f0 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13300 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
13310 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
13320 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
13330 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
13340 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
13350 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
13360 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
13370 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
13380 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
13390 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
133a0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
133b0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
133c0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
133d0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
133e0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
133f0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
13400 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
13410 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
13420 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
13430 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
13440 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
13450 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
13460 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
13470 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
13480 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
13490 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
134a0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
134b0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
134c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
134d0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
134e0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
134f0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
13500 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
13510 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
13520 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
13530 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
13540 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
13550 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13560 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
13570 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
13580 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
13590 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
135a0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
135b0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
135c0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
135d0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
135e0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
135f0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
13600 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
13610 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
13620 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
13630 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
13640 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
13650 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
13660 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
13670 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
13680 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
13690 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
136a0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
136b0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
136c0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
136d0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
136e0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
136f0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
13700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13710 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13720 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13730 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
13770 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
13780 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
13790 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
137a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
137b0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
137c0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
137d0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
137e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
137f0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
13800 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13810 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
13820 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
13830 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13840 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13850 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
13860 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
13870 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
13880 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13890 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
138a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
138b0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
138c0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
138d0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
138e0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
138f0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13900 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
13910 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
13920 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
13930 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
13940 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
13950 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
13960 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
13970 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
13980 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
13990 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
139a0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
139b0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
139c0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
139d0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
139e0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
139f0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
13a00 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
13a10 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
13a20 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
13a30 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
13a40 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
13a50 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
13a60 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
13a70 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
13a80 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
13a90 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
13aa0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
13ab0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
13ac0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
13ad0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
13ae0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
13af0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
13b00 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
13b10 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
13b20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
13b30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
13b40 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
13b50 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
13b60 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
13b70 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
13b80 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
13b90 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
13ba0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
13bb0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
13bc0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
13bd0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
13be0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
13bf0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
13c00 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
13c10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
13c20 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
13c30 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
13c40 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
13c50 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
13c60 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
13c70 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
13c80 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
13c90 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
13ca0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
13cb0 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
13cc0 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
13cd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
13ce0 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
13cf0 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
13d00 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
13d10 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
13d20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
13d30 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
13d40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
13d50 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
13d60 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
13d70 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
13d80 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
13d90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
13da0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
13db0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
13dc0 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
13dd0 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
13de0 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
13df0 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
13e00 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
13e10 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
13e20 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
13e30 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
13e40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
13e50 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
13e60 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
13e70 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
13e80 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
13e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
13ea0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
13eb0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
13ec0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
13ed0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
13ee0 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
13ef0 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
13f00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
13f10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13f20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
13f30 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13f40 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30   pBt->pCursor==0
13f50 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   || pBt->inTrans
13f60 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e  action>TRANS_NON
13f70 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  E );.  if( pBt->
13f80 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
13f90 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
13fa0 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
13fb0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13fc0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
13fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
13fe0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
13ff0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
14000 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
14010 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
14020 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61  ata );.    relea
14030 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67  sePage(pBt->pPag
14040 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  e1);.    pBt->pP
14050 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  age1 = 0;.  }.}.
14060 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
14070 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
14080 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
14090 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
140a0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
140b0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
140c0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
140d0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
140e0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
140f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14100 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
14110 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
14120 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
14130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
14140 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
14150 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14160 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
14170 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
14180 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
14190 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
141a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
141b0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
141c0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
141d0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
141e0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
141f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
14200 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
14210 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
14220 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
14230 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
14240 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
14250 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
14260 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
14270 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
14280 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
14290 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
142a0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
142b0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
142c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
142d0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
142e0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
142f0 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
14300 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
14310 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
14320 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
14330 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
14340 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
14350 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
14360 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
14370 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
14380 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
14390 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
143a0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
143b0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
143c0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
143d0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
143e0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
143f0 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
14400 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
14410 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
14420 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
14430 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14440 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
14450 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
14460 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
14470 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
14480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
14490 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
144a0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
144b0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
144c0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
144d0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
144e0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
144f0 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
14500 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
14510 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
14520 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
14530 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
14540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
14560 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
14570 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
14580 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14590 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
145a0 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
145b0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
145c0 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
145d0 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
145e0 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
145f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
14600 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
14610 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
14620 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
14630 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
14640 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
14650 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
14660 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
14670 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
14680 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
14690 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
146a0 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
146b0 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
146c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
146d0 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
146e0 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
146f0 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
14700 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
14710 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
14720 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
14730 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
14740 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
14750 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
14760 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
14770 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
14780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
14790 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
147a0 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
147b0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
147c0 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
147d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
147e0 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
147f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14800 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
14810 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14820 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
14830 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14840 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
14850 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14860 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
14870 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
14880 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
14890 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
148a0 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
148b0 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
148c0 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
148d0 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
148e0 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
148f0 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
14900 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
14910 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
14920 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
14930 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
14940 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
14950 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
14960 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
14970 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
14980 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
14990 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
149a0 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
149b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
149c0 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
149d0 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
149e0 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
149f0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
14a00 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
14a10 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
14a20 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
14a30 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
14a40 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
14a50 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
14a60 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
14a70 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
14a80 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
14a90 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
14aa0 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
14ab0 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
14ac0 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
14ad0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
14ae0 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
14af0 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
14b00 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
14b10 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
14b20 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
14b30 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
14b40 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
14b50 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
14b60 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
14b70 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
14b80 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
14b90 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
14ba0 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
14bb0 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
14bc0 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
14bd0 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
14be0 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
14bf0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
14c00 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
14c10 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
14c20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
14c30 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
14c40 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14c60 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
14c70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14c80 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
14c90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
14ca0 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
14cb0 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
14cc0 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
14cd0 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
14ce0 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
14cf0 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
14d00 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
14d10 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
14d20 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
14d30 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
14d40 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
14d50 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
14d60 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
14d70 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
14d80 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
14d90 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  n;.  }..  /* Wri
14da0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
14db0 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
14dc0 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
14dd0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
14de0 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
14df0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
14e00 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
14e10 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14e20 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14e30 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
14e40 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14e50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
14e60 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66 20  D_CACHE.  /* If 
14e70 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
14e80 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
14e90 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
14ea0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
14eb0 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
14ec0 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
14ed0 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
14ee0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
14ef0 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
14f00 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
14f10 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f  ITE_LOCKED..  */
14f20 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26  .  if( (wrflag &
14f30 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
14f40 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
14f50 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  E).   || (pBt->b
14f60 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
14f70 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20  NDING)!=0.  ){. 
14f80 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
14f90 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
14fa0 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
14fb0 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
14fc0 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
14fd0 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
14fe0 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
14ff0 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
15000 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
15010 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
15020 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
15030 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
15040 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15060 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
15070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
15080 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
15090 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
150a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
150b0 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
150c0 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
150d0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
150e0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
150f0 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
15100 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15110 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
15120 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
15130 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
15140 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
15150 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
15160 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
15170 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
15180 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
15190 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
151a0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
151b0 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
151c0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
151d0 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
151e0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
151f0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
15200 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
15210 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
15220 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c   &= ~BTS_INITIAL
15230 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20  LY_EMPTY;.  if( 
15240 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20  pBt->nPage==0 ) 
15250 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15260 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
15270 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  MPTY;.  do {.   
15280 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72   /* Call lockBtr
15290 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65  ee() until eithe
152a0 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73  r pBt->pPage1 is
152b0 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20   populated or.  
152c0 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29    ** lockBtree()
152d0 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69   returns somethi
152e0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ng other than SQ
152f0 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72  LITE_OK. lockBtr
15300 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ee().    ** may 
15310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15320 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e   but leave pBt->
15330 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30 20  pPage1 set to 0 
15340 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20  if after.    ** 
15350 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20 69  reading page 1 i
15360 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61 74  t discovers that
15370 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
15380 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
15390 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e      ** file is n
153a0 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ot pBt->pageSize
153b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c  . In this case l
153c0 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20  ockBtree() will 
153d0 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42  update.    ** pB
153e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74  t->pageSize to t
153f0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
15400 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
15410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69  ..    */.    whi
15420 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  le( pBt->pPage1=
15430 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  =0 && SQLITE_OK=
15440 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65  =(rc = lockBtree
15450 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69  (pBt)) );..    i
15460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15470 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15480 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74      if( (pBt->bt
15490 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
154a0 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20  D_ONLY)!=0 ){.  
154b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
154c0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
154d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
154e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
154f0 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
15500 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
15510 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
15520 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
15530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15550 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
15560 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
15570 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15580 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
15590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
155a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
155b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
155c0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26  }.  }while( (rc&
155d0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
155e0 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  SY && pBt->inTra
155f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
15600 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20  NONE &&.        
15610 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73    btreeInvokeBus
15620 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b  yHandler(pBt) );
15630 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
15640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
15650 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15660 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
15670 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
15680 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51  on++;.#ifndef SQ
15690 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
156a0 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28  _CACHE.      if(
156b0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
156c0 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b  .assert( p->lock
156d0 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
156e0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
156f0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
15700 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
15710 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
15720 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
15730 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
15740 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
15750 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
15760 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
15770 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
15780 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
15790 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
157a0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
157b0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
157c0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
157d0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
157e0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
157f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
15800 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
15810 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
15820 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
15830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15840 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15850 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
15860 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
15870 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
15880 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
15890 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
158a0 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
158b0 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
158c0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
158d0 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
158e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
158f0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
15900 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
15910 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
15920 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
15930 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
15940 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
15950 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
15960 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
15970 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
15980 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
15990 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
159a0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
159b0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
159c0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
159d0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
159e0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
159f0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
15a00 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
15a10 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
15a20 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
15a30 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
15a40 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
15a50 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
15a60 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
15a70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
15a80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
15a90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
15aa0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
15ab0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
15ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
15ae0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
15af0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
15b00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
15b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15b20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
15b30 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
15b40 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
15b50 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
15b60 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
15b70 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
15b80 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
15b90 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
15ba0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
15bb0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
15bc0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
15bd0 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
15be0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
15bf0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
15c00 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
15c10 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
15c20 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
15c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15c40 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
15c50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
15c60 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
15c70 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
15c80 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
15c90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15ca0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15cb0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
15cc0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
15cd0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
15ce0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
15cf0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
15d00 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
15d10 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
15d20 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
15d30 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
15d40 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
15d50 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
15d60 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
15d70 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
15d80 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
15d90 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
15da0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
15db0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
15dc0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
15df0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
15e00 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15e30 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
15e40 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
15e50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15e80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15e90 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
15ea0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
15eb0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
15ec0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
15ed0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
15ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15ef0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
15f00 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
15f10 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
15f20 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
15f30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15f40 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
15f50 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
15f60 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
15f70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
15f80 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
15f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
15fa0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
15fb0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
15fc0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
15fd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
15fe0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
15ff0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
16000 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
16010 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
16020 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
16030 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
16040 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
16050 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
16060 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16070 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
16080 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
16090 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
160a0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
160b0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
160c0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
160d0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
160e0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
160f0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
16100 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
16110 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
16120 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
16130 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
16140 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
16150 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
16160 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
16170 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
16180 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
16190 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
161a0 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
161b0 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
161c0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
161d0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
161e0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
161f0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
16200 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
16210 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
16220 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
16230 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
16240 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
16250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
16260 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
16270 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16280 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
16290 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
162a0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
162b0 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
162e0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
162f0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
16300 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
16310 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
16320 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
16330 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
16340 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
16350 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
16360 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
16370 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
16380 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
16390 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
163a0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
163b0 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
163c0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
163d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
163e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
163f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
16400 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
16410 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
16420 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
16430 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
16440 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
16450 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
16460 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
16470 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
16480 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
16490 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
164a0 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
164b0 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
164c0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
164d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
164e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
164f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
16500 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
16510 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
16520 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
16530 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
16540 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
16550 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
16560 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
16570 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
16580 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
16590 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
165a0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
165b0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
165c0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
165d0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
165e0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
165f0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
16600 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
16610 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
16620 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
16630 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
16640 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
16650 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
16660 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
16670 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
16680 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
16690 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
166a0 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
166b0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
166c0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
166d0 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
166e0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
166f0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
16700 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
16710 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
16720 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
16730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16740 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
16750 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
16760 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
16770 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
16780 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
16790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
167a0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
167b0 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
167c0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
167d0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
167e0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
167f0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16800 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16810 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
16820 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
16830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16840 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
16850 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
16860 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16870 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
16880 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
16890 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
168a0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
168b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
168c0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
168d0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
168e0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
168f0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
16900 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
16910 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
16920 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
16930 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
16940 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
16950 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
16960 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
16970 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
16980 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
16990 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
169a0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
169b0 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
169c0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
169d0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
169e0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
169f0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
16a00 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
16a10 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
16a20 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
16a30 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
16a40 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
16a50 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
16a60 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
16a70 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
16a80 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
16a90 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
16aa0 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
16ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16ac0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
16ad0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
16ae0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
16af0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
16b00 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
16b10 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
16b20 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
16b30 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
16b40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
16b50 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
16b60 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
16b70 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
16b80 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
16b90 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
16ba0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
16bb0 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
16bc0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
16bd0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
16be0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
16bf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
16c00 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
16c10 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
16c20 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
16c30 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
16c40 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
16c50 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
16c60 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16c70 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
16c80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
16c90 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
16ca0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
16cb0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
16cc0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
16cd0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16ce0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
16cf0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
16d00 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
16d10 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
16d20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
16d30 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
16d40 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
16d50 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
16d60 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
16d70 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
16d80 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
16d90 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
16da0 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
16db0 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
16dc0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
16dd0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
16de0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
16df0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
16e00 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
16e10 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
16e20 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
16e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16e50 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
16e60 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
16e70 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
16e80 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
16e90 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
16ea0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
16eb0 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
16ec0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
16ed0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
16ee0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
16ef0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
16f00 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
16f10 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
16f20 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
16f30 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
16f40 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
16f50 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
16f60 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
16f70 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
16f80 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
16f90 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
16fa0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
16fb0 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
16fc0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
16fd0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
16fe0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
16ff0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
17000 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
17010 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
17020 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
17030 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
17040 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
17050 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
17060 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17080 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17090 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
170a0 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
170b0 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
170c0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
170d0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
170e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
170f0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
17100 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
17110 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
17120 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17140 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17150 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17160 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
17170 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
17180 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
17190 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
171a0 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
171b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
171c0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
171d0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
171e0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
171f0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
17200 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
17210 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17220 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
17230 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
17240 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
17250 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
17260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
17290 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
172a0 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
172b0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
172c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
172d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
172e0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
172f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17300 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
17310 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
17320 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
17330 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
17340 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
17350 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
17360 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
17380 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
17390 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
173a0 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
173b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
173c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
173d0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
173e0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
173f0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
17400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
17410 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
17420 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
17430 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
17440 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
17450 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
17460 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
17470 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
17480 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a   If successful,.
17490 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
174a0 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
174b0 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
174c0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
174d0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c  .** point in cal
174e0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
174f0 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72  on again), retur
17500 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  n SQLITE_DONE..*
17510 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
17520 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  icly, this funct
17530 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
17540 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
17550 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20  .** database so 
17560 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
17570 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
17580 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a  urrently in use.
17590 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
175a0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  in use..**.** If
175b0 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65   the nFin parame
175c0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
175d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
175e0 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74  ssumes.** that t
175f0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  he caller will k
17600 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
17610 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
17620 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  il.** it returns
17630 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
17640 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
17650 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a  at nFin is the.*
17660 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * number of page
17670 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
17680 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e  ile will contain
17690 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20   after this .** 
176a0 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c  process is compl
176b0 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73  ete.  If nFin is
176c0 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73   zero, it is ass
176d0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63  umed that.** inc
176e0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 77 69  rVacuumStep() wi
176f0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66  ll be called a f
17700 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20  inite amount of 
17710 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d  times.** which m
17720 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d  ay or may not em
17730 70 74 79 20 74 68 65 20 66 72 65 65 6c 69 73 74  pty the freelist
17740 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61  .  A full autova
17750 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e  cuum.** has nFin
17760 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69  >0.  A "PRAGMA i
17770 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
17780 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a  m" has nFin==0..
17790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
177a0 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
177b0 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
177c0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
177d0 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  tPg){.  Pgno nFr
177e0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
177f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
17800 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
17810 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
17820 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
17830 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17840 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
17850 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
17860 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
17870 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
17880 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
17890 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
178a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
178b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
178c0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
178d0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
178e0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
178f0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
17900 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
17910 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
17920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
17930 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
17940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
17950 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
17960 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
17970 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
17980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
179a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
179b0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
179c0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
179d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
179e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
179f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
17a00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
17a10 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
17a20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
17a30 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
17a40 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
17a50 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
17a60 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
17a70 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
17a80 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
17a90 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
17aa0 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
17ab0 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
17ac0 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
17ad0 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
17ae0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17af0 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
17b00 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
17b10 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
17b20 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
17b30 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
17b40 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
17b50 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
17b60 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
17b70 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
17b80 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
17b90 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
17ba0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
17bb0 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
17bc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17bd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17be0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17bf0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
17c00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
17c10 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
17c20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
17c30 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
17c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
17c50 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
17c60 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
17c70 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17c80 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
17c90 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
17ca0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
17cb0 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
17cc0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
17cd0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
17ce0 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
17cf0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
17d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
17d30 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20  f nFin is zero, 
17d40 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
17d50 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
17d60 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
17d70 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
17d80 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
17d90 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
17da0 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
17db0 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
17dc0 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
17dd0 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e  er hand, if nFin
17de0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
17df0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
17e00 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
17e10 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
17e20 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
17e30 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
17e40 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
17e50 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
17e60 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
17e70 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
17e80 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
17e90 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
17ea0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
17eb0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
17ec0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20  g, &iFreePg, 0, 
17ed0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17ef0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
17f00 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
17f10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17f20 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
17f30 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
17f40 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
17f50 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e      }while( nFin
17f60 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e  !=0 && iFreePg>n
17f70 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
17f80 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
17f90 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
17fa0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17fb0 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61 73  3PagerWrite(pLas
17fc0 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  tPg->pDbPage);. 
17fd0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17ff0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
18000 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
18010 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
18020 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e  e, iFreePg, nFin
18030 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
18040 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18050 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
18060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
18080 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18090 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
180a0 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20   nFin==0 ){.    
180b0 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77  iLastPg--;.    w
180c0 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
180d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
180e0 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
180f0 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
18100 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  g) ){.      if( 
18110 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18120 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
18130 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
18140 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  pPg;.        rc 
18150 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
18160 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
18170 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
18180 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
181a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
181b0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
181c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
181d0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
181e0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
181f0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
18200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18220 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18240 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
18250 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
18260 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
18270 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
18280 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70   iLastPg);.    p
18290 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
182a0 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
182b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
182c0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
182d0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
182e0 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
182f0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
18300 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
18310 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
18320 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
18330 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
18340 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
18350 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
18360 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
18370 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
18380 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
18390 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
183a0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
183b0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
183c0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
183d0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
183e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
183f0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18400 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
18410 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
18420 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
18430 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
18440 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
18450 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18460 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
18470 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18480 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
18490 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
184a0 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
184b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
184c0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
184d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
184e0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
184f0 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
18500 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
18510 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
18520 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e  Bt);.    rc = in
18530 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74  crVacuumStep(pBt
18540 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65 63 6f  , 0, btreePageco
18550 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69  unt(pBt));.    i
18560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18570 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
18580 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18590 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
185a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
185b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
185c0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
185d0 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
185e0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
185f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18600 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18610 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18620 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
18630 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
18640 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
18650 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
18660 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
18670 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
18680 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
18690 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
186a0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
186b0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
186c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
186d0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
186e0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
186f0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
18700 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
18710 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
18720 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
18730 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
18740 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
18750 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
18760 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
18770 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
18780 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
18790 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
187a0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
187b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
187c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
187d0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
187e0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
187f0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
18800 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
18810 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
18820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
18830 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
18840 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
18850 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
18860 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
18870 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
18880 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
18890 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
188a0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
188b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
188c0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
188d0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
188e0 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
188f0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
18900 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
18910 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
18920 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
18930 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
18940 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18950 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
18960 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
18970 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
18980 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
18990 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
189a0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e  d */.    int nEn
189b0 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  try;        /* N
189c0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
189d0 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
189e0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
189f0 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a  nOrig;        /*
18a00 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   Database size b
18a10 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f  efore freeing */
18a20 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74  ..    nOrig = bt
18a30 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
18a40 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41  );.    if( PTRMA
18a50 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f  P_ISPAGE(pBt, nO
18a60 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50  rig) || nOrig==P
18a70 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
18a80 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
18a90 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
18aa0 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  ible to create a
18ab0 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 68   database for wh
18ac0 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61  ich the final pa
18ad0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ge.      ** is e
18ae0 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d  ither a pointer-
18af0 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65 20  map page or the 
18b00 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
18b10 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20  e. If one.      
18b20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ** is encountere
18b30 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  d, this indicate
18b40 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  s corruption..  
18b50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
18b60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18b70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
18b80 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
18b90 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18ba0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
18bb0 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d     nEntry = pBt-
18bc0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
18bd0 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46     nPtrmap = (nF
18be0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
18bf0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
18c00 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
18c10 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e  ry;.    nFin = n
18c20 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
18c30 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20  Ptrmap;.    if( 
18c40 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59  nOrig>PENDING_BY
18c50 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20  TE_PAGE(pBt) && 
18c60 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54  nFin<PENDING_BYT
18c70 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18c80 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
18c90 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54   }.    while( PT
18ca0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
18cb0 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d   nFin) || nFin==
18cc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18cd0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
18ce0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
18cf0 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
18d00 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18d10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a  _CORRUPT_BKPT;..
18d20 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
18d30 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
18d40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18d50 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
18d60 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
18d70 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
18d80 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20   iFree);.    }. 
18d90 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49     if( (rc==SQLI
18da0 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53  TE_DONE || rc==S
18db0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72  QLITE_OK) && nFr
18dc0 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
18dd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
18de0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
18df0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
18e00 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
18e10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
18e20 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  2], 0);.      pu
18e30 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18e40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
18e50 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
18e60 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18e70 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e  >aData[28], nFin
18e80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18e90 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
18ea0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
18eb0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
18ec0 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
18ed0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18ef0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18f00 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
18f10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18f20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71  assert( nRef==sq
18f30 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
18f40 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
18f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
18f60 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
18f70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
18f80 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
18f90 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
18fa0 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
18fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
18fc0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
18fd0 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
18fe0 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
18ff0 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
19000 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
19010 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19020 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
19030 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
19040 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
19050 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
19060 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
19070 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
19080 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
19090 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
190a0 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
190b0 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
190c0 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
190d0 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
190e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
190f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19100 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
19110 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
19120 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
19130 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
19140 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
19150 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
19160 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
19170 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
19180 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19190 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
191a0 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
191b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
191c0 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
191d0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
191e0 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
191f0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
19200 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
19210 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
19220 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
19230 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
19240 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
19250 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
19260 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
19270 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
19280 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
19290 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
192a0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
192b0 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
192c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
192d0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
192e0 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
192f0 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
19300 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
19310 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
19320 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
19330 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
19340 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19350 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
19360 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
19370 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
19380 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
19390 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
193a0 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
193b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
193c0 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
193d0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
193e0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
193f0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
19400 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19410 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
19420 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
19430 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
19440 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
19450 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
19460 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
19470 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
19480 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
19490 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
194a0 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
194b0 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
194c0 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
194d0 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
194e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
194f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
19500 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
19510 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
19520 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
19530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
19540 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
19550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
19560 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
19570 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
19580 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19590 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
195a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
195b0 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
195c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
195d0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
195e0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
195f0 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
19600 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
19610 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19630 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19640 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
19650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19660 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
19670 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19680 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
19690 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
196a0 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
196b0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
196c0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
196d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
196e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
196f0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
19700 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
19710 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
19720 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
19730 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
19740 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
19750 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
19760 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
19770 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
19780 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
19790 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
197a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
197b0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
197c0 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65  ) );..  btreeCle
197d0 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
197e0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  );.  if( p->inTr
197f0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
19800 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56  & p->db->activeV
19810 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20  dbeCnt>1 ){.    
19820 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
19830 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
19840 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
19850 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
19860 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
19870 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
19880 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
19890 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
198a0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
198b0 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
198c0 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
198d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
198e0 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
198f0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
19900 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
19910 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
19920 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
19930 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
19940 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
19950 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
19960 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
19970 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
19980 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
19990 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
199a0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
199b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
199c0 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
199d0 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
199e0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
199f0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
19a00 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
19a10 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
19a20 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
19a30 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
19a40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
19a50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
19a60 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
19a70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
19a80 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
19a90 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
19aa0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
19ab0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
19ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
19ad0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
19ae0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
19af0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
19b00 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
19b10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
19b20 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
19b30 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
19b40 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
19b50 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
19b60 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
19b70 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
19b80 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
19b90 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
19ba0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
19bb0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19bc0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
19bd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
19be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
19bf0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19c00 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
19c10 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
19c20 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
19c30 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
19c40 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
19c50 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
19c60 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
19c70 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
19c80 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
19c90 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
19ca0 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
19cb0 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
19cc0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19cd0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
19ce0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
19cf0 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
19d00 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
19d10 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
19d20 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
19d30 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
19d40 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
19d50 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
19d60 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
19d70 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
19d80 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
19d90 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
19da0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
19db0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
19dc0 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
19dd0 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
19de0 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
19df0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
19e00 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
19e10 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
19e20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
19e30 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
19e40 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
19e50 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
19e60 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
19e70 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
19e80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
19e90 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
19ea0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
19eb0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
19ec0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
19ed0 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
19ee0 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
19ef0 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
19f00 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
19f10 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
19f20 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
19f30 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
19f40 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
19f50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
19f60 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
19f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
19f80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
19f90 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
19fa0 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
19fb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
19fc0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
19fd0 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
19fe0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
19ff0 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
1a000 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
1a010 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
1a020 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
1a030 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
1a040 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
1a050 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
1a060 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
1a070 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1a080 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
1a090 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
1a0a0 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
1a0b0 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
1a0c0 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
1a0d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
1a0e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
1a0f0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
1a100 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1a110 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1a120 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1a130 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
1a140 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
1a150 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
1a160 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a170 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1a180 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
1a190 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
1a1a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a1b0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
1a1c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a1d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a1e0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1a1f0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1a200 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
1a210 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
1a220 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
1a230 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
1a240 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
1a250 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
1a260 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1a270 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
1a280 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1a290 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a2a0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1a2b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1a2c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a2d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1a2e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a2f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
1a300 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
1a310 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
1a320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a330 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
1a340 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
1a350 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a360 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
1a370 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
1a380 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1a390 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
1a3a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1a3b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a3c0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1a3d0 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
1a3e0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
1a3f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a400 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1a410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a420 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
1a430 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
1a440 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a450 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
1a460 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1a470 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a480 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1a490 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a4a0 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
1a4b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1a4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1a4d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1a4e0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
1a4f0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
1a500 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1a510 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a520 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
1a530 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1a540 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
1a550 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
1a560 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
1a570 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
1a580 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
1a590 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
1a5a0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
1a5b0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
1a5c0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
1a5d0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
1a5e0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
1a5f0 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
1a600 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
1a610 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
1a620 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
1a630 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
1a640 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
1a650 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
1a660 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
1a670 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
1a680 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
1a690 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
1a6a0 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
1a6b0 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
1a6c0 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
1a6d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1a6e0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
1a6f0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1a700 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
1a710 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
1a720 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
1a730 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
1a740 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
1a750 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
1a760 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
1a770 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
1a780 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
1a790 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
1a7a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1a7b0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1a7c0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1a7d0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1a7e0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1a7f0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
1a800 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
1a810 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1a820 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
1a830 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
1a840 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
1a850 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
1a860 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
1a870 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
1a880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1a890 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
1a8a0 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
1a8b0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
1a8c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1a8d0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
1a8e0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
1a8f0 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
1a900 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
1a910 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
1a920 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
1a930 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
1a940 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
1a950 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
1a960 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
1a970 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
1a980 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
1a990 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
1a9a0 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
1a9b0 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
1a9c0 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
1a9d0 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
1a9e0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
1a9f0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
1aa00 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
1aa10 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1aa20 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1aa30 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
1aa40 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
1aa50 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
1aa60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1aa70 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1aa80 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1aa90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1aaa0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1aab0 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1aac0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1aad0 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1aae0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1aaf0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1ab00 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1ab10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1ab20 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1ab30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ab40 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1ab50 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1ab60 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1ab70 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1ab80 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1ab90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1aba0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1abb0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1abc0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1abd0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1abe0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1abf0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1ac00 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1ac10 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1ac20 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1ac30 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1ac40 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1ac50 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1ac60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1ac70 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1ac80 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1ac90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1aca0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1acb0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1acc0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1acd0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1ace0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1acf0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1ad00 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1ad10 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1ad20 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1ad30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1ad40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1ad50 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
1ad60 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1ad70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
1ad80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1ad90 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
1ada0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1adb0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
1adc0 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
1add0 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
1ade0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1adf0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a  occurred whilst.
1ae00 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
1ae10 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
1ae20 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
1ae30 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
1ae40 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
1ae50 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
1ae60 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
1ae70 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
1ae80 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
1ae90 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
1aea0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
1aeb0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
1aec0 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
1aed0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
1aee0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
1aef0 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
1af00 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
1af10 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
1af20 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
1af30 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
1af40 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
1af50 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
1af60 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
1af70 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
1af80 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1af90 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
1afa0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
1afb0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1afc0 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1afd0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1afe0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1aff0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1b000 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1b010 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1b020 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1b030 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1b040 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1b050 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1b060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b070 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1b080 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1b090 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1b0a0 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1b0b0 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1b0c0 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1b0d0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1b0e0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1b0f0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1b100 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1b110 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1b120 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1b130 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1b140 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
1b150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b160 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1b170 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1b180 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1b190 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b1a0 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
1b1b0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1b1c0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
1b1d0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1b1e0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1b1f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
1b200 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
1b210 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1b220 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
1b230 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b240 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
1b250 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
1b260 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
1b270 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1b280 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1b290 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1b2a0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1b2b0 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1b2c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b2d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b2e0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1b2f0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1b300 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1b310 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1b320 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1b330 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1b340 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1b350 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1b360 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1b370 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1b380 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1b390 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1b3a0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1b3b0 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1b3c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1b3d0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1b3e0 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1b3f0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1b400 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1b410 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1b420 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1b430 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1b440 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1b450 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1b460 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1b470 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1b480 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1b490 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1b4a0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1b4b0 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1b4c0 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1b4d0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1b4e0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1b4f0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1b500 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1b510 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1b520 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1b530 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1b540 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1b550 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1b560 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1b570 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1b580 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1b590 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1b5a0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1b5b0 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1b5c0 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1b5d0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1b5e0 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1b5f0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1b600 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1b610 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1b620 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1b630 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1b640 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1b650 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1b660 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1b670 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1b680 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1b690 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1b6a0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1b6b0 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1b6c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1b6d0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1b6e0 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1b6f0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1b700 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1b710 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1b720 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1b730 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1b740 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1b750 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b760 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
1b770 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1b780 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
1b790 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1b7a0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
1b7b0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
1b7c0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1b7d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b7e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b7f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1b800 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
1b810 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
1b820 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b830 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
1b840 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
1b850 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
1b860 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
1b870 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
1b880 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
1b890 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
1b8a0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
1b8b0 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
1b8c0 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
1b8d0 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
1b8e0 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
1b8f0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1b900 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
1b910 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
1b920 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1b930 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
1b940 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
1b950 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
1b960 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b970 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b980 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1b990 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1b9a0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
1b9b0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
1b9c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
1b9d0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
1b9e0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
1b9f0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
1ba00 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
1ba10 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
1ba20 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
1ba30 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
1ba40 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
1ba50 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
1ba60 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
1ba70 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
1ba80 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
1ba90 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
1baa0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
1bab0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
1bac0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
1bad0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
1bae0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
1baf0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
1bb00 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
1bb10 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1bb20 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
1bb30 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
1bb40 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
1bb50 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
1bb60 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
1bb70 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
1bb80 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
1bb90 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
1bba0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
1bbb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bbc0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
1bbd0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1bbe0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
1bbf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bc00 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
1bc10 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bc20 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1bc30 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1bc40 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1bc50 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
1bc60 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
1bc70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1bc80 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1bc90 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
1bca0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
1bcb0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
1bcc0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
1bcd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1bce0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
1bcf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
1bd00 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1bd10 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
1bd20 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
1bd30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bd40 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70        if( iSavep
1bd50 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e  oint<0 && (pBt->
1bd60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49  btsFlags & BTS_I
1bd70 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21  NITIALLY_EMPTY)!
1bd80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =0 ){.        pB
1bd90 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1bda0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1bdb0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1bdc0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1bdd0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1bde0 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
1bdf0 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
1be00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1be10 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
1be20 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
1be30 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
1be40 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
1be50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1be60 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
1be70 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
1be80 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
1be90 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
1bea0 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
1beb0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
1bec0 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
1bed0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1bee0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1bef0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bf00 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
1bf10 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
1bf20 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
1bf30 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
1bf40 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
1bf50 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
1bf60 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
1bf70 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1bf80 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
1bf90 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
1bfa0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1bfb0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
1bfc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1bfd0 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
1bfe0 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
1bff0 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
1c000 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1c010 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
1c020 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1c030 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1c040 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
1c050 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1c060 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1c070 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
1c080 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
1c090 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1c0a0 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
1c0b0 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
1c0c0 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
1c0d0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
1c0e0 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
1c0f0 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
1c100 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
1c110 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
1c120 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
1c130 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
1c140 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
1c150 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
1c160 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1c170 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
1c180 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
1c190 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1c1a0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
1c1b0 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1c1c0 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
1c1d0 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
1c1e0 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
1c1f0 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
1c200 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
1c210 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
1c220 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
1c230 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
1c240 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
1c250 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
1c260 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
1c270 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
1c280 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
1c290 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
1c2a0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
1c2b0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1c2c0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1c2d0 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
1c2e0 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
1c2f0 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
1c300 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
1c310 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
1c320 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
1c330 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1c340 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
1c350 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
1c360 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
1c370 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
1c380 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
1c390 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
1c3a0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
1c3b0 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
1c3c0 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
1c3d0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
1c3e0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
1c3f0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
1c400 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1c410 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
1c420 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
1c430 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
1c440 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
1c450 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1c460 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1c470 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1c480 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1c490 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1c4c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1c4f0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1c500 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1c510 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1c540 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1c550 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1c560 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1c570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c580 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1c590 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1c5a0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1c5b0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c5d0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1c5e0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1c5f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c600 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1c610 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1c620 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1c630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c640 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1c650 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1c660 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1c670 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1c680 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1c690 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1c6a0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1c6b0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1c6c0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1c6d0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1c6e0 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1c6f0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1c700 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1c710 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1c720 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1c730 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1c740 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1c750 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1c760 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1c770 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1c780 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1c790 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1c7a0 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1c7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1c7c0 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1c7d0 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1c7e0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1c7f0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1c800 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1c810 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1c820 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1c830 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1c840 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1c850 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1c860 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1c870 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c880 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1c890 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1c8a0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c8b0 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1c8c0 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74 2d  (wrFlag && (pBt-
1c8d0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1c8e0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20 29  READ_ONLY)!=0) )
1c8f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c900 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1c910 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
1c920 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
1c930 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
1c940 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
1c950 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
1c960 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
1c970 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
1c980 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
1c990 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
1c9a0 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
1c9b0 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
1c9c0 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
1c9d0 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
1c9e0 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
1c9f0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
1ca00 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
1ca10 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
1ca20 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
1ca30 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1ca40 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
1ca50 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
1ca60 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
1ca70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75  Cur->wrFlag = (u
1ca80 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72  8)wrFlag;.  pCur
1ca90 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1caa0 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43  Cursor;.  if( pC
1cab0 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  ur->pNext ){.   
1cac0 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50   pCur->pNext->pP
1cad0 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a  rev = pCur;.  }.
1cae0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
1caf0 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65   pCur;.  pCur->e
1cb00 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1cb10 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e  NVALID;.  pCur->
1cb20 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b  cachedRowid = 0;
1cb30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cb40 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
1cb50 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
1cb60 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb90 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
1cba0 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1cbd0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1cbe0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1cbf0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
1cc20 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
1cc30 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
1cc40 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1cc50 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1cc60 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1cc70 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
1cc80 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
1cc90 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
1ccc0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
1ccd0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1cce0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1ccf0 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
1cd00 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
1cd10 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
1cd20 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
1cd30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1cd40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1cd50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1cd60 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
1cd70 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
1cd80 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
1cd90 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
1cda0 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
1cdb0 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
1cdc0 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
1cdd0 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
1cde0 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
1cdf0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
1ce00 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
1ce10 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
1ce20 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
1ce30 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
1ce40 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
1ce50 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
1ce60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1ce70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ce80 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
1ce90 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
1cea0 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
1ceb0 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
1cec0 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
1ced0 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
1cee0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
1cef0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
1cf00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
1cf10 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
1cf20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
1cf30 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
1cf40 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
1cf50 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
1cf60 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
1cf70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
1cf80 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
1cf90 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
1cfa0 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
1cfb0 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
1cfc0 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
1cfd0 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
1cfe0 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
1cff0 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
1d000 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
1d010 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1d020 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
1d030 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
1d040 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
1d050 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
1d060 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
1d070 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64 20   Set the cached 
1d080 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20 65  rowid value of e
1d090 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20 74  very cursor in t
1d0a0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1d0b0 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75 72   file.** as pCur
1d0c0 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65 20   and having the 
1d0d0 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20 6e  same root page n
1d0e0 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20 20  umber as pCur.  
1d0f0 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  The value is.** 
1d100 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a 2a  set to iRowid..*
1d110 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74 69  *.** Only positi
1d120 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73 20  ve rowid values 
1d130 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 76  are considered v
1d140 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63 61  alid for this ca
1d150 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63 68  che..** The cach
1d160 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
1d170 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63 61   to zero, indica
1d180 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64 20  ting an invalid 
1d190 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72 65  cache..** A btre
1d1a0 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  e will work fine
1d1b0 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e 65   with zero or ne
1d1c0 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20 20  gative rowids.  
1d1d0 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a 2a  We just cannot.*
1d1e0 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72 20  * cache zero or 
1d1f0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2c  negative rowids,
1d200 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61 62   which means tab
1d210 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65 72  les that use zer
1d220 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76 65  o or.** negative
1d230 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72 75   rowids might ru
1d240 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65  n a little slowe
1d250 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63 74  r.  But in pract
1d260 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ice, zero.** or 
1d270 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1d280 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d 6f  are very uncommo
1d290 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c 64  n so this should
1d2a0 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
1d2b0 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
1d2c0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 64  e3BtreeSetCached
1d2d0 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
1d2e0 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pCur, sqlite3_in
1d2f0 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 42  t64 iRowid){.  B
1d300 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1d310 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e 70  r(p=pCur->pBt->p
1d320 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1d330 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1d340 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43 75  p->pgnoRoot==pCu
1d350 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70 2d  r->pgnoRoot ) p-
1d360 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 69  >cachedRowid = i
1d370 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73 73  Rowid;.  }.  ass
1d380 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68 65  ert( pCur->cache
1d390 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20 29  dRowid==iRowid )
1d3a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1d3b0 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f 77  n the cached row
1d3c0 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  id for the given
1d3d0 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67 61   cursor.  A nega
1d3e0 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  tive or zero.** 
1d3f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1d400 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1d410 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20 69  rowid cache is i
1d420 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
1d430 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  d be.** ignored.
1d440 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20 63    If the rowid c
1d450 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20 62  ache has never b
1d460 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c 20  efore been set, 
1d470 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20 69  then a.** zero i
1d480 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1d490 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c  qlite3_int64 sql
1d4a0 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63 68  ite3BtreeGetCach
1d4b0 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72  edRowid(BtCursor
1d4c0 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
1d4d0 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f  n pCur->cachedRo
1d4e0 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  wid;.}../*.** Cl
1d4f0 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
1d500 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
1d510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d520 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
1d530 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
1d540 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
1d550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d560 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
1d570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d580 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1d590 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
1d5a0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1d5b0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1d5c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1d5d0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
1d5e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d5f0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
1d600 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
1d610 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
1d620 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76   if( pCur->pPrev
1d630 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1d640 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
1d650 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1d660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74  }else{.      pBt
1d670 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1d680 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1d690 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65     if( pCur->pNe
1d6a0 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  xt ){.      pCur
1d6b0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1d6c0 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20   pCur->pPrev;.  
1d6d0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
1d6e0 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1d6f0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1d700 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1d710 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1d720 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
1d730 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
1d740 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65     invalidateOve
1d750 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
1d760 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
1d770 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
1d780 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d790 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1d7a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1d7b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d7c0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
1d7d0 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
1d7e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
1d7f0 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
1d800 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
1d810 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
1d820 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
1d830 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
1d840 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1d850 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1d860 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1d870 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1d880 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1d890 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1d8a0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1d8b0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1d8c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1d8d0 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
1d8e0 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
1d8f0 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
1d900 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
1d910 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
1d920 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
1d930 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
1d940 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
1d950 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
1d960 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
1d970 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
1d980 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
1d990 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
1d9a0 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
1d9b0 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
1d9c0 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
1d9d0 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
1d9e0 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
1d9f0 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
1da00 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
1da10 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
1da20 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
1da30 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
1da40 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
1da50 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
1da60 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
1da70 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
1da80 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
1da90 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
1daa0 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
1dab0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1dac0 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
1dad0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
1dae0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1daf0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
1db00 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
1db10 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
1db20 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1db30 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1db40 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1db50 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1db60 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1db70 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1db80 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1db90 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1dba0 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1dbb0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1dbc0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1dbd0 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1dbe0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1dbf0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1dc00 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1dc10 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1dc20 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1dc30 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1dc40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1dc50 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1dc60 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1dc70 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1dc80 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1dc90 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1dca0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1dcb0 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  e],pCur->aiIdx[i
1dcc0 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66  Page],&pCur->inf
1dcd0 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
1dce0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
1dcf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dd00 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
1dd10 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
1dd20 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
1dd30 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
1dd40 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
1dd50 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
1dd60 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
1dd70 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
1dd80 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
1dd90 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddd0 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43        \.  if( pC
1dde0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1ddf0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74         \.    int
1de30 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
1de40 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74          \.    bt
1de80 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
1de90 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
1dea0 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
1deb0 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
1dec0 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61  ; \.    pCur->va
1ded0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20  lidNKey = 1;    
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20     \.  }else{   
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74      \.    assert
1df70 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20  CellInfo(pCur); 
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69       \.  }.#endi
1dfc0 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f  f /* _MSC_VER */
1dfd0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1dfe0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
1dff0 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
1e000 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1e010 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
1e020 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1e030 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
1e040 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
1e050 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
1e060 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
1e070 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1e080 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
1e090 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
1e0a0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
1e0b0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
1e0c0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1e0d0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
1e0e0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
1e0f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1e100 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1e110 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1e120 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1e130 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1e140 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
1e150 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
1e160 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  UG */../*.** Set
1e170 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73   *pSize to the s
1e180 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65  ize of the buffe
1e190 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  r needed to hold
1e1a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
1e1b0 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65   the key for the
1e1c0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
1e1d0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
1e1e0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a  s not pointing.*
1e1f0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  * to a valid ent
1e200 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65  ry, *pSize is se
1e210 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46  t to 0. .**.** F
1e220 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  or a table with 
1e230 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20  the INTKEY flag 
1e240 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  set, this routin
1e250 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65  e returns the ke
1e260 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74  y.** itself, not
1e270 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1e280 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e  ytes in the key.
1e290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e2a0 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20  r must position 
1e2b0 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72  the cursor prior
1e2c0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1e2d0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a  s routine..** .*
1e2e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
1e2f0 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20  annot fail.  It 
1e300 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1e310 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69  QLITE_OK.  .*/.i
1e320 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1e330 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  eySize(BtCursor 
1e340 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a  *pCur, i64 *pSiz
1e350 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
1e360 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1e370 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1e380 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1e390 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
1e3a0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
1e3b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1e3c0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1e3d0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
1e3e0 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d   ){.    *pSize =
1e3f0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1e400 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1e410 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d  r);.    *pSize =
1e420 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1e430 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e440 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e450 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
1e460 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1e470 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20  ytes of data in 
1e480 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a  the entry the.**
1e490 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c   cursor currentl
1e4a0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
1e4b0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
1e4c0 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  st guarantee tha
1e4d0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
1e4e0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f  pointing to a no
1e4f0 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20  n-NULL.** valid 
1e500 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72  entry.  In other
1e510 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c   words, the call
1e520 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75  ing procedure mu
1e530 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20  st guarantee.** 
1e540 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1e550 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74  has Cursor.eStat
1e560 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  e==CURSOR_VALID.
1e570 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69  .**.** Failure i
1e580 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
1e590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
1e5a0 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
1e5b0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d  LITE_OK..** It m
1e5c0 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c  ight just as wel
1e5d0 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72 65  l be a procedure
1e5e0 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64   (returning void
1e5f0 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75  ) but we continu
1e600 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61  e.** to return a
1e610 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74  n integer result
1e620 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72   code for histor
1e630 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f  ical reasons..*/
1e640 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1e650 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72 73  eDataSize(BtCurs
1e660 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
1e670 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1e680 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1e690 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1e6a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e6b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e6c0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
1e6d0 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65  (pCur);.  *pSize
1e6e0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44   = pCur->info.nD
1e6f0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ata;.  return SQ
1e700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1e710 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
1e720 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
1e730 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
1e740 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
1e750 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
1e760 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
1e770 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
1e780 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1e790 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
1e7a0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1e7b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1e7c0 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
1e7d0 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
1e7e0 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
1e7f0 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
1e800 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
1e810 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1e820 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
1e830 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1e840 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
1e850 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
1e860 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1e870 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
1e880 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1e890 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
1e8a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
1e8b0 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
1e8c0 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
1e8d0 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
1e8e0 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
1e8f0 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
1e900 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
1e910 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
1e920 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
1e930 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
1e940 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
1e950 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
1e960 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
1e970 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
1e980 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
1e990 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
1e9a0 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
1e9b0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1e9c0 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
1e9d0 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
1e9e0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1e9f0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
1ea00 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
1ea10 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
1ea20 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
1ea30 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
1ea40 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
1ea50 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
1ea60 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
1ea70 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
1ea80 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
1ea90 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
1eaa0 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
1eab0 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
1eac0 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
1ead0 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
1eae0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1eaf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1eb00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1eb10 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb30 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
1eb40 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1eb50 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
1eb60 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
1eb70 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
1eb80 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
1eb90 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
1eba0 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
1ebb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1ebc0 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
1ebd0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
1ebe0 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
1ebf0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1ec00 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
1ec10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1ec20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ec30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1ec40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ec50 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
1ec60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ec70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ec80 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
1ec90 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
1eca0 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1ecb0 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
1ecc0 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
1ecd0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
1ece0 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
1ecf0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
1ed00 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
1ed10 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
1ed20 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
1ed30 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
1ed40 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
1ed50 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
1ed60 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
1ed70 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
1ed80 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
1ed90 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
1eda0 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
1edb0 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
1edc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1edd0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1ede0 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
1edf0 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
1ee00 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
1ee10 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1ee20 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
1ee30 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
1ee40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ee50 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
1ee60 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
1ee70 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
1ee80 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1ee90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1eea0 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
1eeb0 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
1eec0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1eed0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1eee0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1eef0 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
1ef00 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
1ef10 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
1ef20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ef30 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
1ef40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1ef50 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
1ef60 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
1ef70 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
1ef80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ef90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1efa0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
1efb0 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29 3b  vfl, &pPage, 0);
1efc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
1efd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1efe0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
1eff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f000 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1f010 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1f020 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1f030 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1f040 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1f050 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1f060 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1f070 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1f080 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1f090 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1f0a0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1f0b0 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1f0c0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1f0d0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1f0e0 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1f0f0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1f100 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1f110 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1f120 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1f130 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1f140 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1f150 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1f160 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1f170 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1f180 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1f190 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1f1a0 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1f1b0 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1f1c0 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1f1d0 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1f1e0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1f1f0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1f200 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1f210 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1f220 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1f230 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1f240 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1f250 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f260 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1f270 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1f280 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1f290 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1f2a0 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1f2b0 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1f2c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1f2d0 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1f2e0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1f2f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1f300 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1f310 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1f320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f330 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1f340 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1f350 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1f360 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1f370 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1f380 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1f390 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1f3a0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1f3b0 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1f3c0 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1f3d0 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1f3e0 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1f3f0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1f400 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1f410 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1f420 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1f430 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1f440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f470 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1f480 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1f490 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1f4a0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1f4b0 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1f4c0 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1f4d0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1f4e0 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1f4f0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1f500 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f510 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1f520 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1f530 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1f540 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1f550 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1f560 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1f570 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1f580 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1f590 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1f5a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1f5b0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1f5c0 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1f5d0 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1f5e0 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1f5f0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1f600 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1f610 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1f620 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1f630 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1f640 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1f650 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1f660 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1f670 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1f680 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1f690 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1f6a0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
1f6b0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
1f6c0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
1f6d0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1f6e0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
1f6f0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
1f700 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
1f710 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1f720 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1f730 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1f740 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1f750 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1f760 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1f770 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1f780 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1f790 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1f7a0 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1f7b0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1f7c0 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1f7d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1f7e0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1f7f0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1f800 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1f810 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1f820 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1f830 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1f840 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1f850 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1f860 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1f870 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1f880 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1f890 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1f8a0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1f8b0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1f8c0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1f8d0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1f8e0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1f8f0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1f900 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1f910 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1f920 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1f930 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1f940 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1f950 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1f960 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f970 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1f980 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1f990 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1f9a0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1f9b0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1f9c0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1f9d0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1f9e0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1f9f0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1fa00 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1fa10 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1fa20 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1fa30 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1fa40 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1fa50 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1fa60 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1fa70 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1fa80 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1fa90 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1faa0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fac0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1fad0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1fae0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1faf0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1fb00 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1fb10 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb30 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1fb40 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1fb50 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1fb60 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1fb70 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1fb80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1fb90 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1fba0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1fbb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1fbc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1fbd0 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1fbe0 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1fbf0 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1fc00 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1fc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fc20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1fc30 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1fc40 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1fc50 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1fc60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1fc70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1fc80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fc90 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1fca0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1fcb0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1fcc0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1fcd0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1fce0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1fcf0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1fd00 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1fd10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1fd20 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1fd30 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1fd40 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1fd50 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 4e  .nKey);..  if( N
1fd60 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74 20  EVER(offset+amt 
1fd70 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
1fd80 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c 20  o.nData) .   || 
1fd90 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1fda0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1fdb0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1fdc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1fdd0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1fde0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1fdf0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1fe00 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1fe10 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1fe20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fe30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1fe40 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1fe50 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1fe60 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1fe70 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1fe80 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1fe90 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1fea0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1feb0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1fec0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1fed0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1fee0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1fef0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1ff00 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1ff10 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1ff20 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1ff30 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1ff40 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1ff50 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1ff60 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1ff70 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1ff80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1ff90 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1ffa0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1ffb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ffc0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1ffd0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1ffe0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1fff0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
20000 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
20010 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
20020 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
20030 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
20040 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
20050 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
20060 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
20070 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20080 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
20090 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
200a0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
200b0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
200c0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
200d0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
200e0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
200f0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
20100 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
20110 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
20120 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
20130 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
20140 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
20150 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
20160 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
20170 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
20180 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
20190 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
201a0 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
201b0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
201c0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
201d0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
201e0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
201f0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
20200 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
20210 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
20220 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
20230 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
20240 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
20250 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
20260 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
20270 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
20280 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
20290 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
202a0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
202b0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
202c0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
202d0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
202e0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f 2a  nOvfl);.      /*
202f0 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79 73   nOvfl is always
20300 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20 69   positive.  If i
20310 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65 74  t were zero, fet
20320 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64 20  chPayload would 
20330 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  have.      ** be
20340 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  en used instead 
20350 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  of this routine.
20360 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41 4c   */.      if( AL
20370 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20 21  WAYS(nOvfl) && !
20380 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
203a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
203b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
203c0 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
203d0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
203e0 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
203f0 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
20400 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
20410 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
20420 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
20430 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
20440 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
20450 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
20460 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
20470 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
20480 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
20490 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
204a0 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
204b0 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
204c0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
204d0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
204e0 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
204f0 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
20500 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
20510 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
20520 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20530 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
20540 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
20550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20560 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
20570 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
20580 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
20590 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
205a0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
205b0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
205c0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
205d0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
205e0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
205f0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20600 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
20610 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
20620 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
20630 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
20640 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
20650 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
20660 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
20670 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
20680 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
20690 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
206a0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
206b0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
206c0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
206d0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
206e0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
206f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
20700 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
20710 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
20720 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
20730 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
20740 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
20750 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
20760 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
20770 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
20780 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
20790 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
207a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
207b0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
207c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
207d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
207e0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
207f0 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
20800 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
20810 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20820 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
20830 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
20840 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
20850 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
20860 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
20870 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
20880 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
20890 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
208a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
208b0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
208c0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
208d0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
208e0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
208f0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
20900 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
20910 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
20920 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
20930 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
20940 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
20950 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
20960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20970 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
20980 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
20990 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
209a0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
209b0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
209c0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
209d0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
209e0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
209f0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
20a00 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
20a10 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
20a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
20a30 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
20a40 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
20a50 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
20a60 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
20a70 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
20a80 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
20a90 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
20aa0 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
20ab0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
20ac0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
20ad0 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
20ae0 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
20af0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
20b00 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
20b10 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
20b20 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
20b30 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
20b40 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
20b50 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
20b60 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
20b70 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
20b80 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
20b90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20ba0 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
20bb0 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
20bc0 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
20bd0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
20be0 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
20bf0 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
20c00 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
20c10 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
20c20 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
20c30 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
20c40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
20c50 20 65 4f 70 3d 3d 30 20 20 20 20 20 20 20 20 20   eOp==0         
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
20c90 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
20ca0 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cd0 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
20ce0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
20cf0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
20d00 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
20d10 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
20d20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
20d30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
20d40 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
20d50 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
20d60 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
20d70 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31    && pBt->pPage1
20d80 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30  ->aData[19]==0x0
20d90 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
20da0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
20db0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
20dc0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
20dd0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
20de0 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
20df0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
20e00 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57  memcpy(aSave, aW
20e10 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  rite, 4);.      
20e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20e30 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74  OsRead(fd, aWrit
20e40 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74  e, a+4, (i64)pBt
20e50 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74  ->pageSize*(next
20e60 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20  Page-1));.      
20e70 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
20e80 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b  et4byte(aWrite);
20e90 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
20ea0 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c  y(aWrite, aSave,
20eb0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
20ec0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  se.#endif..     
20ed0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44     {.          D
20ee0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
20ef0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20f00 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
20f10 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74  Bt->pPager, next
20f20 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b  Page, &pDbPage);
20f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
20f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20f50 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
20f60 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
20f70 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
20f80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
20f90 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
20fa0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20fc0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
20fd0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
20fe0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
20ff0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21000 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
21010 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
21020 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
21030 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
21040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
21050 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
21060 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
21070 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
21080 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
21090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
210a0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
210b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
210c0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
210d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
210e0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
210f0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
21100 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
21110 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
21120 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
21130 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
21140 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
21150 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
21160 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
21170 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
21180 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
21190 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
211a0 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
211b0 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
211c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
211d0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
211e0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
211f0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
21200 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
21210 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
21220 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
21230 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
21240 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
21250 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
21260 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21270 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
21280 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
21290 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
212a0 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
212b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
212c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
212d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
212e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
212f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
21300 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
21310 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
21320 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
21330 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21340 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
21350 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
21360 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
21370 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
21380 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
21390 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
213a0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
213b0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
213c0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
213d0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
213e0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
213f0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
21400 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
21410 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
21420 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
21430 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
21440 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
21450 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
21460 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21470 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
21480 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
21490 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
214a0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
214b0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
214c0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
214d0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
214e0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
214f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21500 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
21510 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
21520 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
21530 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
21540 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
21550 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
21560 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
21570 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
21580 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
21590 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
215a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
215b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
215c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
215d0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
215e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
215f0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
21600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21610 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
21620 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21630 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
21640 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
21650 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
21660 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
21670 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21680 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21690 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
216a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
216b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
216c0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
216d0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
216e0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
216f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21700 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21710 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
21720 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
21730 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
21740 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
21750 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
21760 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
21770 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
21780 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
21790 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
217a0 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
217b0 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
217c0 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
217d0 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
217e0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
217f0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
21800 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
21810 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
21820 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
21830 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
21840 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
21850 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
21860 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
21870 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
21880 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
21890 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
218a0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
218b0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
218c0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
218d0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
218e0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
218f0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
21900 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
21910 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
21920 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
21930 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
21940 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
21950 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
21960 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
21970 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
21980 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
21990 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
219a0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
219b0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
219c0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
219d0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
219e0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
219f0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
21a00 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
21a10 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
21a20 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
21a30 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
21a40 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
21a50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21a60 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
21a70 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
21a80 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
21a90 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
21aa0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
21ab0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
21ac0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
21ad0 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
21ae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
21af0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
21b00 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
21b10 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
21b20 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
21b30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
21b40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
21b50 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
21b60 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
21b70 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
21b80 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
21b90 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
21ba0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
21bb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
21bc0 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
21bd0 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
21be0 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
21bf0 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
21c00 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
21c10 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
21c20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21c30 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
21c40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21c50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21c60 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21c70 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21c80 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
21c90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21ca0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
21cb0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21cc0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
21cd0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  e->nCell );.  if
21ce0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e  ( NEVER(pCur->in
21cf0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a  fo.nSize==0) ){.
21d00 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
21d10 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
21d20 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43  pCur->iPage], pC
21d30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21d40 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
21d50 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72             &pCur
21d60 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61  ->info);.  }.  a
21d70 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
21d80 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
21d90 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
21da0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
21db0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21dc0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
21dd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21de0 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72  nKey = (int)pCur
21df0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
21e00 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
21e10 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b  {.    aPayload +
21e20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63  = nKey;.    nLoc
21e30 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
21e40 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20  nLocal - nKey;. 
21e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63   }else{.    nLoc
21e60 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
21e70 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65  nLocal;.    asse
21e80 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79  rt( nLocal<=nKey
21e90 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20   );.  }.  *pAmt 
21ea0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
21eb0 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
21ec0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
21ed0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
21ee0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
21ef0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
21f00 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
21f10 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
21f20 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
21f30 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
21f40 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
21f50 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
21f60 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
21f70 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
21f80 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
21f90 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
21fa0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
21fb0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
21fc0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
21fd0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
21fe0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
21ff0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
22000 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
22010 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
22020 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
22030 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
22040 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
22050 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
22060 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
22070 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
22080 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
22090 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
220a0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
220b0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
220c0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
220d0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
220e0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
220f0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
22100 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
22110 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
22120 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
22130 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
22140 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
22150 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
22160 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22170 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
22180 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
22190 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
221a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
221b0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
221c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
221d0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
221e0 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
221f0 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
22200 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
22210 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
22220 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
22230 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
22240 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
22250 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
22260 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
22270 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
22280 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
22290 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
222a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
222b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
222c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
222d0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
222e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
222f0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
22300 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
22310 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
22320 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
22330 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
22340 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
22350 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
22360 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
22370 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
22380 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
22390 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
223a0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
223b0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
223c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
223d0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
223e0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
223f0 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
22400 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
22410 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
22420 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
22430 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
22440 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
22450 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
22460 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
22470 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
22480 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
22490 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
224a0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
224b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
224c0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
224d0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
224e0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
224f0 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
22500 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
22510 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
22520 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
22530 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
22540 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
22550 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
22560 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22570 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22590 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
225a0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
225b0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
225c0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
225d0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
225e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
225f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22600 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
22610 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
22620 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
22630 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
22640 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
22650 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
22660 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
22670 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
22680 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
22690 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
226a0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
226b0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
226c0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
226d0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50  nCell<1 || pNewP
226e0 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  age->intKey!=pCu
226f0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e  r->apPage[i]->in
22700 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
22710 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22720 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
22730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22740 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
22750 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
22760 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
22770 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
22780 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
22790 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
227a0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
227b0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
227c0 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
227d0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
227e0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
227f0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
22800 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
22810 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
22820 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
22830 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
22840 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
22850 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
22860 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
22870 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22880 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
22890 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
228a0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
228b0 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
228c0 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
228d0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
228e0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
228f0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
22900 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
22910 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
22920 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
22930 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
22940 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
22950 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
22960 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
22970 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
22980 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
22990 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
229a0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
229b0 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
229c0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
229d0 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
229e0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
229f0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
22a00 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
22a10 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
22a20 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
22a30 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
22a40 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
22a50 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
22a60 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
22a70 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
22a80 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
22a90 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
22aa0 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
22ab0 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
22ac0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
22ad0 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
22ae0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
22af0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
22b00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22b10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22b20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22b30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22b40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22b50 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
22b60 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22b70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
22b80 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
22b90 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
22ba0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22bb0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
22bc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22bd0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
22be0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22bf0 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
22c00 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
22c10 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
22c20 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
22c30 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
22c40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22c50 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
22c60 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
22c70 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
22c80 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
22c90 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
22ca0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
22cb0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
22cc0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
22cd0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
22ce0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
22cf0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
22d00 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
22d10 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
22d20 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
22d30 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
22d40 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
22d50 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
22d60 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
22d70 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
22d80 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
22d90 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
22da0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
22db0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
22dc0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
22dd0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
22de0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
22df0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
22e00 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
22e10 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
22e20 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
22e30 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
22e40 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
22e50 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
22e60 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
22e70 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
22e80 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
22e90 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
22ea0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
22eb0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
22ec0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
22ed0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
22ee0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22ef0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
22f00 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
22f10 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
22f20 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
22f30 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
22f40 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
22f50 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
22f60 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
22f70 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
22f80 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
22f90 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
22fa0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
22fb0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
22fc0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
22fd0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
22fe0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
22ff0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
23000 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
23010 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
23020 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
23030 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
23040 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
23050 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
23060 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
23070 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
23080 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
23090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
230a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
230b0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
230c0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
230d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
230e0 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
230f0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
23100 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23110 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
23120 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
23130 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
23140 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
23150 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
23160 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
23170 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
23180 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
23190 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
231a0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
231b0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
231c0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
231d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
231e0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
231f0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
23200 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
23210 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
23220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23230 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
23240 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
23250 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
23260 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
23270 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
23280 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
23290 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
232a0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
232b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
232c0 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
232d0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
232e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
232f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
23300 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
23310 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
23320 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
23330 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
23340 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
23350 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
23360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23370 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
23380 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
23390 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
233a0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
233b0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
233c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
233d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
233e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
233f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
23400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
23410 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
23420 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  age = 0;..    /*
23430 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
23440 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
23450 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
23460 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
23470 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65   cursor.    ** e
23480 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
23490 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
234a0 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
234b0 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
234c0 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  .    ** NULL, th
234d0 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
234e0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
234f0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
23500 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a  the case,.    **
23510 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
23520 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
23530 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
23540 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23550 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
23560 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
23570 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
23580 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79   if( (pCur->pKey
23590 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e  Info==0)!=pCur->
235a0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
235b0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
235c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
235d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
235e0 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
235f0 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  at the root page
23600 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
23610 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75  ct type. This mu
23620 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63  st be the.  ** c
23630 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20  ase as the call 
23640 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
23650 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65   that loaded the
23660 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68   root-page (eith
23670 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  er.  ** this cal
23680 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20  l or a previous 
23690 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c  invocation) woul
236a0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
236b0 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a  corruption .  **
236c0 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69   if the assumpti
236d0 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
236e0 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  , and it is not 
236f0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
23700 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74   flags .  ** byt
23710 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d  e to have been m
23720 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68  odified while th
23730 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c  is cursor is hol
23740 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
23750 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
23760 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d  e.  */.  pRoot =
23770 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
23780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
23790 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
237a0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73  gnoRoot );.  ass
237b0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
237c0 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65  it && (pCur->pKe
237d0 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74  yInfo==0)==pRoot
237e0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70  ->intKey );..  p
237f0 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
23800 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
23810 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
23820 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
23830 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23840 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f   = 0;..  if( pRo
23850 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ot->nCell==0 && 
23860 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
23870 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
23880 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
23890 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
238a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
238b0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
238c0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
238d0 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
238e0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
238f0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
23900 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
23910 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
23920 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
23930 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
23940 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
23950 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
23960 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
23970 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
23980 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
23990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
239a0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
239b0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
239c0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
239d0 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
239e0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
239f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
23a00 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
23a10 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
23a20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
23a30 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
23a40 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
23a50 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
23a60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
23a70 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
23a80 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23a90 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
23aa0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23ab0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
23ac0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
23ad0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23ae0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23af0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
23b00 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23b10 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
23b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
23b30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
23b40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23b50 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
23b60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
23b70 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23b80 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
23b90 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
23ba0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
23bb0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
23bc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
23bd0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
23be0 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
23bf0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23c00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
23c10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
23c20 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
23c30 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
23c40 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
23c50 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
23c60 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23c70 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
23c80 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
23c90 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
23ca0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
23cb0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
23cc0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23cd0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
23ce0 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
23cf0 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
23d00 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
23d10 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
23d20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
23d30 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
23d40 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
23d50 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
23d60 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
23d70 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
23d80 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
23d90 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
23da0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
23db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
23dc0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
23dd0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23de0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
23df0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23e00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
23e10 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
23e20 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23e30 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23e40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23e50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23e60 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
23e70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
23e80 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
23e90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23ea0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
23eb0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
23ec0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
23ed0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
23ee0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
23ef0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23f00 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
23f10 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
23f20 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
23f30 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
23f40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f50 20 20 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 20 3d 20 70 50  Cur->iPage] = pP
23f70 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
23f80 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23f90 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
23fa0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
23fb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23fc0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
23fd0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
23fe0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
23ff0 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
24000 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
24010 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
24020 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
24030 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
24040 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
24050 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
24060 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
24070 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
24080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24090 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
240a0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
240b0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
240c0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
240d0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
240e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
240f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24100 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
24110 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
24120 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
24130 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
24140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24150 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
24160 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
24170 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
24180 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
24190 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
241a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
241b0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
241c0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
241d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
241e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
241f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24200 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
24210 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
24220 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
24230 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
24240 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
24250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
24260 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
24270 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24280 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
24290 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
242a0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
242b0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
242c0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
242d0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
242e0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
242f0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
24300 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
24310 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
24320 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
24330 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
24340 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
24350 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
24360 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
24370 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
24380 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
24390 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
243a0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
243b0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
243c0 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
243d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
243e0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
243f0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
24400 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
24410 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
24420 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
24430 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
24440 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
24450 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
24460 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
24470 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
24480 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
24490 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
244a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
244b0 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
244c0 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
244d0 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
244e0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
244f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
24500 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
24510 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
24520 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
24530 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
24540 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
24550 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24560 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
24570 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
24580 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
24590 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
245a0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
245b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
245c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
245d0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
245e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
245f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
24600 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
24610 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
24620 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24630 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24640 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24650 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24660 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
24670 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
24680 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24690 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
246a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
246b0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
246c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
246d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
246e0 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
246f0 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
24700 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20  ITE_OK ?1:0;.   
24710 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
24720 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
24730 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
24740 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
24750 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
24760 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
24770 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
24780 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
24790 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
247a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
247b0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
247c0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
247d0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
247e0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
247f0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
24800 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
24810 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
24820 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
24830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
24840 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
24850 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
24860 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
24870 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
24880 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
24890 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
248a0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
248b0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
248c0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
248d0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
248e0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
248f0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
24900 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
24910 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
24920 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
24930 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
24940 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
24950 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
24960 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
24970 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
24980 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
24990 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
249a0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
249b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
249c0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
249d0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
249e0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
249f0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
24a00 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
24a10 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
24a30 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
24a40 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
24a50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
24a60 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
24a70 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
24a80 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
24a90 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
24aa0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
24ab0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
24ac0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
24ad0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
24ae0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
24af0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24b00 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
24b10 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
24b20 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
24b30 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
24b40 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
24b50 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
24b60 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
24b80 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
24b90 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
24ba0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24bb0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
24bc0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
24bd0 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
24be0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
24bf0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
24c00 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
24c10 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
24c20 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
24c30 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
24c40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c50 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
24c60 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
24c70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
24c80 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
24c90 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
24ca0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
24cb0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
24cc0 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
24cd0 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
24ce0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
24cf0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24d00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24d10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24d20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24d30 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24d40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
24d50 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
24d60 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
24d70 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
24d80 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
24d90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
24da0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
24db0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
24dc0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
24dd0 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
24de0 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
24df0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
24e00 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
24e10 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
24e20 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24e30 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
24e40 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ey .   && pCur->
24e50 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
24e60 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
24e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
24e80 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
24e90 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
24ea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24eb0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
24ec0 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26  ( pCur->atLast &
24ed0 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
24ee0 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
24ef0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
24f00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24f10 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24f20 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
24f30 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
24f40 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
24f50 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
24f60 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
24f70 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
24f80 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24f90 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
24fa0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
24fb0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
24fc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
24fd0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
24fe0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24ff0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
25000 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
25010 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
25020 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
25030 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25040 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
25050 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
25060 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
25070 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25080 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25090 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
250a0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
250b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
250c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
250d0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
250e0 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
250f0 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
25100 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
25110 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  x;.    Pgno chld
25120 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
25130 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
25140 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25150 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a  e];.    int c;..
25160 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
25170 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
25180 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
25190 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
251a0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
251b0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
251c0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
251d0 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
251e0 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
251f0 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
25200 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
25210 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
25220 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
25230 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
25240 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
25250 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
25260 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
25270 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
25280 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
25290 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
252a0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
252b0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
252c0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
252d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
252e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
252f0 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
25300 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
25310 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
25320 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
25330 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
25340 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
25350 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
25360 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
25370 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
25380 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62  ell-1;.    if( b
25390 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
253a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
253b0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
253c0 36 29 28 69 64 78 20 3d 20 75 70 72 29 3b 0a 20  6)(idx = upr);. 
253d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
253e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
253f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
25400 28 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  (idx = (upr+lwr)
25410 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
25420 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38  or(;;){.      u8
25430 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
25460 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
25470 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20  pPage */..      
25480 61 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75  assert( idx==pCu
25490 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
254a0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 20 20 70  Page] );.      p
254b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
254c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  = 0;.      pCell
254d0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
254e0 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
254f0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
25500 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
25510 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25520 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
25530 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
25540 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
25550 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
25560 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
25570 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
25580 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
25590 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
255a0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
255b0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
255c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
255d0 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
255e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
255f0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
25600 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
25610 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
25620 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
25630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
25650 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
25660 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
25670 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
25680 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
25690 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
256a0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
256b0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
256c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
256d0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
256e0 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
256f0 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
25700 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
25710 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
25720 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
25730 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
25740 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
25750 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
25760 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
25770 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
25780 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
25790 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
257a0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
257b0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
257c0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
257d0 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
257e0 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
257f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
25800 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
25810 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
25820 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
25830 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
25840 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
25850 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
25860 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
25870 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
25880 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
25890 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
258a0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
258b0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
258c0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
258d0 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d       if( nCell<=
258e0 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
258f0 61 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20  ayload.         
25900 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65  /* && (pCell+nCe
25910 6c 6c 29 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ll)<pPage->aData
25920 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  End */.        )
25930 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
25940 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
25950 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
25960 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
25970 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
25980 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
25990 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
259a0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
259b0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
259c0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
259d0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
259e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
259f0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
25a00 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
25a10 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
25a20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
25a30 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
25a40 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
25a50 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
25a60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
25a70 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
25a80 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
25a90 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
25aa0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
25ab0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
25ac0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
25ad0 20 20 20 20 20 20 2f 2a 20 26 26 20 28 70 43 65        /* && (pCe
25ae0 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61  ll+nCell+2)<=pPa
25af0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a  ge->aDataEnd */.
25b00 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
25b10 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
25b20 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
25b30 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
25b40 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
25b50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
25b60 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
25b70 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
25b80 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
25b90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
25ba0 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
25bb0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
25bc0 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
25bd0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
25be0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
25bf0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
25c00 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
25c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25c20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
25c30 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
25c40 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
25c50 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
25c60 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
25c70 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
25c80 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
25c90 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
25ca0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
25cb0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
25cc0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
25cd0 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
25ce0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
25cf0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
25d00 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
25d10 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
25d20 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
25d30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
25d40 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
25d50 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
25d60 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
25d70 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
25d80 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
25d90 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43       btreeParseC
25da0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
25db0 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e  ellBody, &pCur->
25dc0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  info);.         
25dd0 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43   nCell = (int)pC
25de0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
25df0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65           pCellKe
25e00 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
25e10 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  c( nCell );.    
25e20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b        if( pCellK
25e30 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ey==0 ){.       
25e40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25e50 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
25e60 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
25e70 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
25e80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
25e90 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
25ea0 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
25eb0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
25ec0 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20  )pCellKey, 0);. 
25ed0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
25ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
25ef0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
25f00 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
25f10 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
25f20 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
25f30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
25f40 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
25f50 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
25f60 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
25f70 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
25f80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
25f90 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
25fa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25fb0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
25fc0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
25fd0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
25fe0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
25ff0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
26000 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26020 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
26030 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26050 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
26060 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
26070 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
26080 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
26090 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
260a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
260b0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
260c0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
260d0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
260e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
260f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
26100 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26110 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69  iPage] = (u16)(i
26120 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
26130 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
26140 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
26150 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
26160 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
26170 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
26180 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
26190 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
261a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
261b0 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
261c0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
261d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
261e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
261f0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
26200 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
26210 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
26220 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
26230 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
26240 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
26250 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
26260 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
26270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26280 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26290 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
262a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
262b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
262c0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
262d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
262e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
262f0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
26300 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
26310 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
26320 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
26330 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
26340 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
26350 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
26360 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
26370 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
26380 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
26390 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
263a0 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
263b0 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
263c0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
263d0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
263e0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
263f0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
26400 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
26410 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
26420 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
26430 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
26440 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
26450 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
26460 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
26470 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
26480 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
26490 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
264a0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
264b0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
264c0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
264d0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
264e0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
264f0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
26500 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
26510 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
26520 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
26530 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
26540 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
26550 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
26560 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
26570 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
26580 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
26590 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
265a0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
265b0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
265c0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
265d0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
265e0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
265f0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
26600 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
26610 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
26620 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
26630 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
26640 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
26650 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
26660 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
26670 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
26680 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
26690 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
266a0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
266b0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
266c0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
266d0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
266e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
266f0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
26700 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
26710 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
26720 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
26730 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
26740 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26750 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
26760 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
26770 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
26780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26790 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
267a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
267b0 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
267c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
267d0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
267e0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
267f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26800 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
26810 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
26820 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
26830 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
26840 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
26850 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26860 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
26870 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
26880 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26890 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
268a0 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
268b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
268c0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
268d0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
268e0 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61  assert( idx<=pPa
268f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
26900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26910 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
26920 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
26930 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
26940 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
26950 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
26960 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
26970 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
26980 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
26990 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
269a0 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
269b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
269c0 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   rc;.      rc = 
269d0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
269e0 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  Cur);.      *pRe
269f0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
26a00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
26a10 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
26a20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
26a30 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
26a40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
26a50 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
26a60 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
26a70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26a80 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
26a90 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
26aa0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
26ab0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
26ac0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
26ad0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
26ae0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26af0 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
26b00 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
26b10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
26b20 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
26b30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26b40 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
26b50 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
26b60 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
26b70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
26b80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26b90 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
26ba0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
26bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
26bd0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
26be0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
26bf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
26c00 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
26c10 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
26c20 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
26c30 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
26c40 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
26c50 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
26c60 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
26c70 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
26c80 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
26c90 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
26ca0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
26cb0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
26cc0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
26cd0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
26ce0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
26cf0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
26d00 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
26d10 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
26d20 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
26d30 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
26d40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26d50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26d60 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
26d70 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
26d80 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
26d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26da0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
26db0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
26dc0 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
26dd0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
26de0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
26df0 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
26e00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26e10 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
26e20 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
26e30 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
26e40 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
26e50 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
26e60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
26e70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
26e80 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
26e90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26ea0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
26eb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
26ec0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
26ed0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
26ee0 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
26ef0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26f00 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
26f10 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
26f20 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
26f30 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
26f40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
26f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26f60 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65   }.    rc = move
26f70 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
26f80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26f90 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
26fa0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
26fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
26fc0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
26fd0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
26fe0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
26ff0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
27000 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
27010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27020 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
27030 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
27040 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
27050 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
27060 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
27070 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
27080 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
27090 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
270a0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
270b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
270c0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
270d0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
270e0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
270f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
27100 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
27110 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
27120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
27150 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
27160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
27170 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
27180 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
27190 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
271a0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
271b0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
271c0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
271d0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
271e0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
271f0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
27200 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
27210 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
27220 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
27230 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
27240 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
27250 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
27260 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
27270 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
27280 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
27290 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
272a0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
272b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
272c0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
272d0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
272e0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
272f0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
27300 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
27310 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
27320 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
27330 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
27340 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
27350 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
27360 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
27370 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
27380 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
27390 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
273a0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
273b0 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
273c0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
273d0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
273e0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
273f0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
27400 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
27410 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
27420 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
27430 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
27440 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
27450 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
27460 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
27470 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
27480 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
27490 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
274a0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
274b0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
274c0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
274d0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
274e0 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
274f0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
27500 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
27510 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
27520 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
27530 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
27540 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
27550 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
27560 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
27570 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
27580 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
27590 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
275a0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
275b0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
275c0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
275d0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
275e0 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
275f0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
27600 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
27610 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27620 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
27630 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
27640 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
27650 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
27660 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
27670 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
27680 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
27690 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
276a0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
276b0 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
276c0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
276d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
276e0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
276f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27700 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
27710 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
27720 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
27730 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
27740 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
27750 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
27760 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
27770 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
27780 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
27790 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
277a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
277b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
277c0 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
277d0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
277e0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
277f0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
27800 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
27810 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
27820 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
27830 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
27840 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
27850 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
27860 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
27870 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
27880 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72 61  the 'exact' para
27890 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20 61  meter was true a
278a0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
278b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
278c0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
278d0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
278e0 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
278f0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
27900 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
27910 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
27920 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
27930 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
27940 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
27950 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27960 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63 74  UM.    if( exact
27970 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61   && nearby<=mxPa
27980 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65  ge ){.      u8 e
27990 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65  Type;.      asse
279a0 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a  rt( nearby>0 );.
279b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
279c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
279d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
279e0 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62  apGet(pBt, nearb
279f0 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20  y, &eType, 0);. 
27a00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27a10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69  turn rc;.      i
27a20 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
27a30 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
27a40 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
27a50 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
27a60 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72     *pPgno = near
27a70 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  by;.    }.#endif
27a80 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
27a90 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
27aa0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
27ab0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
27ac0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
27ad0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
27ae0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
27af0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
27b00 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
27b10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
27b20 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
27b30 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
27b40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
27b50 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
27b60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
27b70 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
27b80 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
27b90 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
27ba0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
27bb0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
27bc0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
27bd0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
27be0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
27bf0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
27c00 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
27c10 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
27c20 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
27c30 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
27c40 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  located..    */.
27c50 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
27c60 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
27c70 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
27c80 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
27c90 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
27ca0 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
27cb0 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  k->aData[0]);.  
27cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27cd0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
27ce0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
27cf0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
27d00 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
27d10 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
27d20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
27d30 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20  runk>mxPage ){. 
27d40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27d50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27d60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27d70 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
27d80 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
27d90 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
27da0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27db0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
27dc0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
27dd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
27de0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
27df0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
27e00 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
27e10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27e20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
27e30 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65  );..      k = ge
27e40 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
27e50 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20  aData[4]); /* # 
27e60 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 69  of leaves on thi
27e70 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  s trunk page */.
27e80 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
27e90 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
27ea0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27eb0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
27ec0 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
27ed0 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
27ee0 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
27ef0 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
27f00 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
27f10 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
27f20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
27f30 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
27f40 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
27f50 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
27f60 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
27f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27f80 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
27f90 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
27fa0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27fb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27fc0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27fe0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
27ff0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
28000 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
28010 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
28020 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
28030 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
28040 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
28050 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
28060 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28070 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
28080 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
28090 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
280a0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
280b0 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
280c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
280d0 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
280e0 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
280f0 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
28100 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
28110 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
28120 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
28130 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
28140 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28150 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
28160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
28170 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
28180 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
28190 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69  ist && nearby==i
281a0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
281b0 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   /* The list is 
281c0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61  being searched a
281d0 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  nd this trunk pa
281e0 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20  ge is the page. 
281f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c         ** to all
28200 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73  ocate, regardles
28210 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20  s of whether it 
28220 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20  has leaves..    
28230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
28240 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69  ssert( *pPgno==i
28250 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20  Trunk );.       
28260 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
28270 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  k;.        searc
28280 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
28290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
282a0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
282b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
282c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
282d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
282e0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
282f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28300 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20    if( k==0 ){.  
28310 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
28320 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
28330 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
28340 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
28350 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
28360 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
28370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28390 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
283a0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
283b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
283c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
283d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
283e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
283f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28400 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28410 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
28420 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
28430 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
28440 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
28450 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
28460 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
28470 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
28480 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
28490 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
284a0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
284b0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
284c0 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
284d0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
284e0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
284f0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
28500 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
28510 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
28520 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
28530 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
28540 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
28550 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
28560 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
28570 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
28580 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
28590 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  mxPage ){ .     
285a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
285b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
285c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
285d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
285e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
285f0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
28600 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
28610 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
28620 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
28630 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  tPage(pBt, iNewT
28640 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
28650 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
28660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28670 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28680 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
28690 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
286a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
286b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
286c0 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
286d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
286e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
286f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28700 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28710 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
28720 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
28730 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28740 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
28750 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
28760 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
28770 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
28780 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
28790 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
287a0 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
287b0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
287c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
287d0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
287e0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
287f0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
28800 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
28810 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
28820 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28830 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
28840 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
28850 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
28860 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
28870 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
28880 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
28890 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
288a0 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
288b0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
288c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
288d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
288e0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
288f0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
28900 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28910 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28920 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28930 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28950 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
28960 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
28970 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
28980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
289a0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
289b0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
289c0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
289d0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
289e0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
289f0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
28a00 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
28a10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
28a20 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
28a30 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
28a40 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
28a50 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
28a60 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
28a70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
28a80 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
28a90 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
28aa0 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
28ab0 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
28ac0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
28ad0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
28ae0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
28af0 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
28b00 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
28b10 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
28b20 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
28b30 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
28b40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
28b50 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
28b60 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
28b70 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
28b80 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
28b90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28ba0 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
28bb0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
28bc0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
28bd0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
28be0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
28bf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28c10 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
28c20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28c30 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
28c40 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
28c50 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
28c60 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
28c70 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
28c80 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
28c90 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
28ca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
28cb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
28cc0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28cd0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28cf0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
28d00 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
28d10 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
28d20 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
28d30 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
28d40 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
28d50 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
28d60 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
28d70 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28d80 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
28d90 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
28da0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
28db0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
28dc0 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
28dd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28de0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
28df0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
28e00 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
28e10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28e20 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28e30 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
28e40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28e50 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
28e60 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
28e70 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
28e80 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
28e90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
28ea0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
28eb0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
28ec0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
28ed0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
28ee0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
28ef0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
28f00 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
28f10 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
28f20 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
28f30 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
28f40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
28f50 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
28f60 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
28f70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28f80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28f90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28fa0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
28fb0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
28fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28fd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28ff0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
29000 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
29020 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
29030 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
29040 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29050 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29060 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
29070 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
29080 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
29090 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
290a0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
290b0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
290c0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
290d0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
290e0 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
290f0 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
29100 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
29110 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29120 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
29130 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
29140 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
29150 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
29160 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
29170 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
29180 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
29190 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
291a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
291b0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
291c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
291d0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
291e0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
291f0 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
29200 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
29210 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
29220 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
29230 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
29240 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
29250 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
29260 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
29270 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
29280 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
29290 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
292a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
292b0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
292c0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
292d0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
292e0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
292f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
29300 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
29310 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
29320 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
29330 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
29340 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
29350 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
29360 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
29370 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
29380 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
29390 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
293a0 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  ge, &pPg, 1);.  
293b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
293c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
293d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
293e0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
293f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
29400 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
29410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29420 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29430 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
29440 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
29450 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
29460 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
29470 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
29480 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
29490 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
294a0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
294b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
294c0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
294d0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
294e0 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
294f0 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
29500 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
29510 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
29520 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
29530 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
29540 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
29550 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
29560 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29570 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
29580 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
29590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
295a0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
295b0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
295c0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
295d0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
295e0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
295f0 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
29600 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
29610 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
29620 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
29630 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29640 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
29650 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
29660 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
29670 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
29680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29690 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
296a0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
296b0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
296c0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
296d0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
296e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
296f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29700 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
29710 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
29720 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
29730 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
29740 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
29750 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
29760 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29770 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d  eable((*ppPage)-
29780 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
29790 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
297a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
297b0 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
297c0 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
297d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
297e0 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
297f0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
29800 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
29810 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
29820 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
29830 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
29840 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
29850 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
29860 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
29870 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
29880 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
29890 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
298a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
298b0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
298c0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
298d0 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
298e0 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
298f0 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
29900 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
29910 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
29920 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
29930 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
29940 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
29950 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
29960 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
29970 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
29980 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
29990 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
299a0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
299b0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
299c0 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
299d0 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
299e0 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
299f0 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
29a00 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
29a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
29a20 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
29a30 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
29a40 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
29a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
29a60 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
29a70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
29a80 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
29a90 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
29aa0 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
29ab0 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
29ac0 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
29ad0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
29b00 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
29b10 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b40 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
29b50 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
29b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b70 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
29b80 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
29b90 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
29ba0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29bb0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
29bc0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
29bd0 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
29be0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
29bf0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
29c00 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
29c10 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
29c20 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
29c30 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
29c40 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
29c50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
29c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
29c70 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
29c80 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
29c90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
29ca0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
29cb0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
29cc0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
29cd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29ce0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
29cf0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
29d00 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29d10 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
29d20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29d30 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
29d40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
29d50 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
29d60 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
29d70 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
29d80 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
29d90 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
29da0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
29db0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
29dc0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
29dd0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
29de0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
29df0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
29e00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
29e10 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
29e20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
29e30 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
29e40 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
29e50 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
29e60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29e70 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
29e80 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
29e90 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
29ea0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
29eb0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
29ec0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
29ed0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
29ee0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
29ef0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
29f00 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
29f10 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
29f20 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
29f30 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
29f40 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
29f50 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
29f60 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
29f70 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
29f80 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
29f90 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
29fa0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
29fb0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29fc0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29fd0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
29fe0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
29ff0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
2a000 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
2a010 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
2a020 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
2a030 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
2a040 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
2a050 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
2a060 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
2a070 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2a080 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
2a090 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2a0a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
2a0b0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
2a0c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
2a0d0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
2a0e0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
2a0f0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
2a100 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2a110 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
2a120 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
2a130 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
2a140 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
2a150 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
2a160 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
2a170 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
2a180 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
2a190 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
2a1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a1b0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2a1c0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
2a1d0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
2a1e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2a1f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2a200 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
2a210 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2a220 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2a230 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
2a240 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2a250 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2a260 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2a270 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
2a280 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2a290 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
2a2a0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2a2b0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
2a2c0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
2a2d0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2a2e0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
2a2f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2a300 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2a310 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2a320 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2a330 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
2a340 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2a350 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
2a360 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2a370 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
2a380 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
2a390 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
2a3a0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
2a3b0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
2a3c0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
2a3d0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2a3e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2a3f0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
2a400 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
2a410 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
2a420 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
2a430 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
2a440 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2a450 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
2a460 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
2a470 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
2a480 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
2a490 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2a4a0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
2a4b0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
2a4c0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
2a4d0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
2a4e0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
2a4f0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2a500 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2a510 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2a520 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
2a530 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
2a540 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
2a550 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
2a560 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
2a570 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2a580 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
2a590 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
2a5a0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
2a5b0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
2a5c0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
2a5d0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
2a5e0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
2a5f0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2a600 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
2a610 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
2a620 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
2a630 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
2a640 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
2a650 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
2a660 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
2a670 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
2a680 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
2a690 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
2a6a0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
2a6b0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2a6c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a6d0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2a6e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2a6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a700 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2a710 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2a720 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
2a730 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
2a740 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
2a750 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
2a760 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2a770 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
2a780 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
2a790 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
2a7a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2a7b0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
2a7c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2a7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a7e0 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
2a7f0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
2a800 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2a810 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
2a820 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
2a830 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
2a840 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
2a850 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
2a860 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2a870 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2a880 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
2a890 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
2a8a0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
2a8b0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
2a8c0 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
2a8d0 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2a8e0 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
2a8f0 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
2a900 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2a910 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
2a920 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2a930 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2a940 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
2a950 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2a960 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2a970 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2a980 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
2a990 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
2a9a0 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
2a9b0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
2a9c0 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
2a9d0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2a9e0 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
2a9f0 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
2aa00 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2aa10 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2aa20 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
2aa30 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
2aa40 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2aa50 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2aa60 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2aa70 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2aa80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2aa90 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2aaa0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2aab0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2aac0 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2aad0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2aae0 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2aaf0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2ab00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2ab10 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2ab20 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2ab30 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2ab40 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2ab50 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2ab60 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2ab70 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2ab80 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2ab90 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2aba0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2abb0 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2abc0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2abd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2abe0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2abf0 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2ac00 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2ac10 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2ac20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2ac30 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2ac40 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2ac50 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2ac60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2ac70 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2ac80 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2ac90 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2aca0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
2acb0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
2acc0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
2acd0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2ace0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2acf0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2ad00 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2ad10 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
2ad20 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
2ad30 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
2ad40 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
2ad50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2ad60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2ad70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2ad80 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2ad90 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2ada0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
2adb0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2adc0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2add0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2ade0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2adf0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2ae00 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2ae10 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2ae20 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2ae30 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2ae40 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2ae50 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2ae60 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ae70 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
2ae80 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
2ae90 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
2aea0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2aeb0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2aec0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2aed0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2aee0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2aef0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2af00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2af10 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2af20 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2af30 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2af40 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2af50 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2af60 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2af70 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2af80 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2af90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2afa0 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2afb0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2afc0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2afd0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2afe0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2aff0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2b000 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2b010 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2b020 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2b030 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2b040 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2b050 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2b060 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2b070 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2b080 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2b090 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2b0a0 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2b0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b0c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b0d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2b0e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2b0f0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2b100 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2b110 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2b120 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2b130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2b140 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2b150 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2b160 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2b170 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2b180 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2b190 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2b1a0 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2b1b0 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2b1c0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2b1d0 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2b1e0 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2b1f0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2b200 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2b210 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2b220 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2b230 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2b240 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2b250 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2b260 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2b270 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2b280 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2b290 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2b2a0 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2b2b0 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2b2c0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2b2d0 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2b2e0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2b2f0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2b300 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2b310 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2b320 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2b330 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2b340 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2b350 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2b360 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2b370 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2b380 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2b390 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2b3a0 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2b3b0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2b3c0 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2b3d0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2b3e0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2b3f0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2b400 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2b410 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2b420 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2b430 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b440 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2b450 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2b460 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2b470 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2b480 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2b490 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2b4a0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2b4b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2b4c0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2b4d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b4e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b4f0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2b500 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2b510 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b520 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2b530 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2b540 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2b550 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2b560 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2b570 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2b580 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2b590 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2b5a0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2b5b0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2b5c0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2b5d0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2b5e0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2b5f0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2b600 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2b610 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2b620 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2b630 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2b640 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2b650 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2b660 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2b670 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2b680 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2b690 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2b6a0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2b6b0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2b6c0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2b6d0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2b6e0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2b6f0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2b700 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2b710 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2b720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2b730 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2b740 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2b750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b760 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2b770 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2b780 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2b790 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2b7a0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2b7b0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2b7c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2b7d0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2b7e0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2b7f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2b800 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2b810 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2b820 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b840 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2b850 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2b860 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2b870 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2b880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b890 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2b8a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2b8b0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2b8c0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2b8d0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2b8e0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2b8f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2b900 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2b910 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2b920 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2b930 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2b940 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2b950 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2b960 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2b970 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2b980 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2b990 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2b9a0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2b9b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b9c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b9d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2b9e0 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2b9f0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2ba00 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2ba10 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2ba20 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2ba30 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2ba40 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2ba50 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2ba60 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2ba70 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2ba80 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2ba90 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2baa0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2bab0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2bac0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bad0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bae0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2baf0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2bb00 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2bb10 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2bb20 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2bb30 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2bb40 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2bb50 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2bb60 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2bb70 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2bb80 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2bb90 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2bba0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2bbb0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2bbc0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2bbd0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2bbe0 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2bbf0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2bc00 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2bc10 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2bc20 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2bc30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2bc40 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2bc50 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2bc60 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2bc70 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2bc80 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2bc90 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2bca0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2bcb0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2bcc0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2bcd0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2bce0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2bcf0 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2bd00 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2bd10 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2bd20 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2bd30 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2bd40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bd50 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2bd60 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2bd70 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2bd80 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2bd90 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2bda0 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2bdb0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2bdc0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2bdd0 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2bde0 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2bdf0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2be00 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2be10 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2be20 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2be30 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2be40 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2be50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2be60 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2be70 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2be80 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2be90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2bea0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2beb0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2bec0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2bed0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2bee0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2bef0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2bf00 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2bf10 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2bf20 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2bf30 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2bf40 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2bf50 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2bf60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2bf70 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2bf80 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2bf90 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2bfa0 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2bfb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bfc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bfd0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2bfe0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2bff0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2c000 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2c010 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2c020 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2c030 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2c040 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2c050 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2c060 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2c070 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2c080 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2c090 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2c0a0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2c0b0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2c0c0 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2c0d0 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2c0e0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2c0f0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2c100 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2c110 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2c120 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2c130 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2c140 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2c150 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2c160 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2c170 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2c180 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
2c190 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2c1a0 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2c1b0 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2c1c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2c1d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c1e0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2c1f0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2c200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c210 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2c220 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2c230 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2c240 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2c250 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2c260 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2c270 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2c280 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2c290 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2c2a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2c2b0 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2c2c0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2c2d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c2e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c2f0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2c300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c310 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2c320 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2c330 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2c340 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2c350 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2c360 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2c370 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2c380 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2c390 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2c3a0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2c3b0 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2c3c0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2c3d0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c3e0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2c3f0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2c400 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2c410 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2c420 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2c430 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2c440 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2c450 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2c460 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2c470 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2c480 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2c490 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2c4a0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2c4b0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2c4c0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c4d0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2c4e0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2c4f0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2c500 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2c510 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2c520 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2c530 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2c540 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2c550 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2c560 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2c570 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2c580 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2c590 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2c5a0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2c5b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c5c0 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2c5d0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2c5e0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2c5f0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2c600 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2c610 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2c620 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2c630 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2c640 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2c650 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2c660 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2c670 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2c680 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2c690 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2c6a0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2c6b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c6c0 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2c6d0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2c6e0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2c6f0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2c700 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2c710 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2c720 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2c730 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c740 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2c750 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2c760 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2c770 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2c780 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2c790 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2c7a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c7b0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2c7c0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2c7d0 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2c7e0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2c7f0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2c800 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2c810 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2c820 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2c830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c840 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2c850 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2c860 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2c870 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2c880 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2c890 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2c8a0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2c8b0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2c8c0 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2c8d0 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2c8e0 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2c8f0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2c900 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2c910 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2c920 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2c930 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2c940 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2c950 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2c960 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2c970 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2c980 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2c990 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2c9a0 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2c9b0 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2c9c0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2c9d0 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2c9e0 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2c9f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2ca00 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2ca10 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2ca20 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2ca30 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2ca40 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2ca50 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2ca60 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2ca70 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2ca80 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2ca90 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2caa0 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2cab0 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2cac0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2cad0 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2cae0 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2caf0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2cb00 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2cb10 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2cb20 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2cb30 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2cb40 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2cb50 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2cb60 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64  dPtr;     /* End
2cb70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
2cb80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2cb90 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2cba0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2cbb0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2cbc0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2cbd0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2cbe0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2cbf0 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2cc00 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2cc10 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2cc20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2cc30 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2cc40 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2cc50 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2cc60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2cc70 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2cc80 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2cc90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2cca0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ccb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2ccc0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ccd0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2cce0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2ccf0 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2cd00 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2cd10 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2cd20 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2cd30 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2cd40 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2cd50 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2cd60 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2cd70 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2cd80 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2cd90 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2cda0 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2cdb0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2cdc0 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2cdd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2cde0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2cdf0 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2ce00 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2ce10 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2ce20 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2ce30 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2ce40 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26    }.  endPtr = &
2ce50 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2ce60 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  2*pPage->nCell -
2ce70 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   2];.  assert( (
2ce80 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2ce90 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2cea0 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2ceb0 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2cec0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72   */.  while( ptr
2ced0 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a  <endPtr ){.    *
2cee0 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31  (u16*)ptr = *(u1
2cef0 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20  6*)&ptr[2];.    
2cf00 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
2cf10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2cf20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2cf30 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2cf40 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2cf50 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2cf60 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2cf70 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2cf80 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2cf90 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2cfa0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2cfb0 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2cfc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2cfd0 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2cfe0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2cff0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2d000 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2d010 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2d020 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2d030 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2d040 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2d050 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2d060 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2d070 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2d080 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2d090 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2d0a0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2d0b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2d0c0 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2d0d0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2d0e0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2d0f0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2d100 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2d110 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2d120 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2d130 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2d140 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2d150 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2d160 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2d170 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2d180 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2d190 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2d1a0 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2d1b0 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2d1c0 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2d1d0 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2d1e0 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2d1f0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2d200 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2d210 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2d220 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2d230 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2d240 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2d250 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2d260 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2d270 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2d280 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2d290 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d2a0 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2d2b0 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2d2c0 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2d2d0 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2d2e0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2d2f0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2d300 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2d310 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2d320 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2d330 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2d340 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2d350 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2d360 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2d370 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2d380 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2d390 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2d3a0 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2d3b0 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2d3c0 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2d3d0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2d3e0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2d3f0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2d400 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2d410 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2d420 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2d430 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2d440 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
2d450 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
2d460 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2d470 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2d480 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2d490 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2d4a0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2d4b0 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2d4c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2d4d0 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2d4e0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2d4f0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2d500 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2d510 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2d520 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2d530 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2d540 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2d550 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2d560 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2d570 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2d580 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2d590 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2d5a0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2d5b0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2d5c0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2d5d0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2d5e0 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2d5f0 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2d600 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65  ata[] */.  u8 *e
2d610 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20  ndPtr;       /* 
2d620 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  End of the loop 
2d630 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20  */..  int nSkip 
2d640 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2d650 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2d660 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2d670 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2d680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2d690 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2d6a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d6b0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2d6c0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2d6d0 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2d6e0 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2d6f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d700 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2d710 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2d720 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d730 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d740 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d750 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2d760 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2d770 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2d780 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2d790 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2d7a0 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2d7b0 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2d7c0 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2d7d0 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2d7e0 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2d7f0 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2d800 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2d810 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2d820 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2d830 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2d840 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2d850 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2d860 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2d870 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2d880 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2d890 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2d8a0 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2d8b0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2d8c0 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2d8d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2d8e0 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2d8f0 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2d900 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2d910 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2d920 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2d930 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2d940 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2d950 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2d960 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2d970 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2d980 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2d990 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2d9a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2d9b0 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2d9c0 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2d9d0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2d9e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2d9f0 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2da00 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2da10 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2da20 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2da30 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2da40 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2da50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2da60 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2da70 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2da80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2da90 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2daa0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2dab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dac0 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2dad0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2dae0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2daf0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2db00 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2db10 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2db20 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2db30 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2db40 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2db50 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2db60 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2db70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2db80 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2db90 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2dba0 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2dbb0 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2dbc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dbd0 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2dbe0 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2dbf0 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2dc00 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2dc10 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2dc20 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2dc30 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2dc40 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2dc50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2dc60 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2dc70 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2dc80 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
2dc90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2dca0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
2dcb0 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
2dcc0 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
2dcd0 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
2dce0 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
2dcf0 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
2dd00 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2dd10 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
2dd20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2dd30 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
2dd40 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74  d);.    }.    pt
2dd50 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a  r = &data[end];.
2dd60 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61      endPtr = &da
2dd70 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73  ta[ins];.    ass
2dd80 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2dd90 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2dda0 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2ddb0 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2ddc0 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68  ligned */.    wh
2ddd0 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20  ile( ptr>endPtr 
2dde0 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29  ){.      *(u16*)
2ddf0 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74  ptr = *(u16*)&pt
2de00 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
2de10 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   -= 2;.    }.   
2de20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2de30 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
2de40 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
2de50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2de60 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2de70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2de80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2de90 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
2dea0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
2deb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2dec0 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
2ded0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2dee0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2def0 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
2df00 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
2df10 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2df20 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2df30 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
2df40 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
2df50 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
2df60 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
2df70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2df80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2df90 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
2dfa0 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
2dfb0 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
2dfc0 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
2dfd0 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
2dfe0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
2dff0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
2e000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2e010 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
2e020 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2e030 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
2e040 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
2e050 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
2e060 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
2e070 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
2e080 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
2e090 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
2e0a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2e0b0 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
2e0c0 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
2e0d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2e0e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
2e0f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2e100 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e110 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2e120 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f  *pCellptr;     /
2e130 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2e140 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
2e150 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
2e160 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2e170 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
2e180 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  dy */.  u8 * con
2e190 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
2e1a0 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
2e1b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2e1c0 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  o data for pPage
2e1d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2e1e0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2e1f0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
2e200 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
2e210 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a  eader on pPage *
2e220 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55  /.  const int nU
2e230 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70  sable = pPage->p
2e240 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20  Bt->usableSize; 
2e250 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
2e260 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  f page */..  ass
2e270 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2e280 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
2e290 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2e2a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2e2b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e2c0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d   assert( nCell>=
2e2d0 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74  0 && nCell<=(int
2e2e0 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  )MX_CELL(pPage->
2e2f0 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  pBt).           
2e300 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c   && (int)MX_CELL
2e310 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2e320 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  921);.  assert( 
2e330 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e340 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e350 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2e360 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2e370 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2e380 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2e390 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2e3a0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2e3b0 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2e3c0 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  ( get2byteNotZer
2e3d0 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  o(&data[hdr+5])=
2e3e0 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
2e3f0 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65  Cellptr = &pPage
2e400 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
2e410 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2e420 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2e430 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2e440 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20  ; i--){.    u16 
2e450 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  sz = aSize[i];. 
2e460 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2e470 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2e480 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79  = sz;.    put2by
2e490 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2e4a0 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2e4b0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2e4c0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  y], apCell[i], s
2e4d0 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  z);.  }.  put2by
2e4e0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2e4f0 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
2e500 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2e510 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
2e520 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2e530 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
2e540 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
2e550 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
2e560 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
2e570 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2e580 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
2e590 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
2e5a0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
2e5b0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
2e5c0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
2e5d0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
2e5e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
2e5f0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2e600 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
2e610 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
2e620 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2e630 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2e640 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
2e650 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
2e660 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
2e670 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
2e680 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
2e690 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
2e6a0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2e6b0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
2e6c0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
2e6d0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
2e6e0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
2e6f0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
2e700 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
2e710 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
2e720 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
2e730 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
2e740 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
2e750 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
2e760 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
2e770 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
2e780 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
2e790 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
2e7a0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
2e7b0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
2e7c0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
2e7d0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
2e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e7f0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
2e800 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2e810 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
2e820 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
2e830 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
2e840 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
2e850 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
2e860 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
2e870 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2e880 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
2e890 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
2e8a0 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
2e8b0 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
2e8c0 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
2e8d0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
2e8e0 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
2e8f0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
2e900 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
2e910 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
2e920 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
2e930 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
2e940 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
2e950 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
2e960 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
2e970 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
2e980 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
2e990 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
2e9a0 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
2e9b0 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
2e9c0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
2e9d0 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
2e9e0 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
2e9f0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
2ea00 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
2ea10 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
2ea20 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
2ea30 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
2ea40 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
2ea50 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
2ea60 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
2ea70 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
2ea80 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
2ea90 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
2eaa0 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
2eab0 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
2eac0 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
2ead0 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
2eae0 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
2eaf0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
2eb00 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
2eb10 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
2eb20 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
2eb30 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
2eb40 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
2eb50 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
2eb60 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
2eb70 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2eb80 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
2eb90 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
2eba0 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
2ebb0 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
2ebc0 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
2ebd0 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
2ebe0 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
2ebf0 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
2ec00 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
2ec10 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
2ec20 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
2ec30 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
2ec40 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2ec50 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
2ec60 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
2ec70 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
2ec80 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
2ec90 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
2eca0 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
2ecb0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
2ecc0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2ecd0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
2ece0 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
2ecf0 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
2ed00 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
2ed10 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
2ed20 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
2ed30 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
2ed40 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2ed50 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2ed60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2ed70 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
2ed80 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
2ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2edb0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2edc0 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ede0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2edf0 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
2ee00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ee10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2ee20 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2ee30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2ee40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2ee50 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2ee60 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2ee70 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2ee80 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
2ee90 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
2eea0 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
2eeb0 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
2eec0 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
2eed0 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
2eee0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20  age->nCell<=0 ) 
2eef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2ef00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
2ef10 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2ef20 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
2ef30 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2ef40 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
2ef50 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
2ef60 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
2ef70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
2ef80 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
2ef90 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
2efa0 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
2efb0 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
2efc0 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
2efd0 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
2efe0 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
2eff0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f000 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
2f010 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
2f020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f030 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
2f040 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
2f050 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
2f060 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
2f070 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36  ].pCell;.    u16
2f080 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
2f090 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2f0a0 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
2f0b0 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
2f0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f0d0 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
2f0e0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
2f0f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
2f100 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
2f110 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2f120 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
2f130 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
2f140 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2f150 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2f160 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  F);.    assemble
2f170 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
2f180 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
2f190 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2f1a0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2f1b0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2f1c0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2f1d0 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65  ap.    ** with e
2f1e0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
2f1f0 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
2f200 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
2f210 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  e .    ** cell o
2f220 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
2f230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2f240 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
2f250 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  se.    ** operat
2f260 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20  ions fails, the 
2f270 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2f280 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  et, but the cont
2f290 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
2f2a0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61  he parent page a
2f2b0 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c  re still manipul
2f2c0 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65  ated by thh code
2f2d0 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54   below..    ** T
2f2e0 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68  hat is Ok, at th
2f2f0 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72  is point the par
2f300 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72  ent page is guar
2f310 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  anteed to.    **
2f320 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
2f330 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  rty. Returning a
2f340 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c  n error code wil
2f350 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a  l cause a.    **
2f360 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69   rollback, undoi
2f370 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ng any changes m
2f380 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ade to the paren
2f390 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
2f3a0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2f3b0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72  UUM ){.      ptr
2f3c0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2f3d0 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
2f3e0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2f3f0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
2f400 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d  ( szCell>pNew->m
2f410 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
2f420 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2f430 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c  Ptr(pNew, pCell,
2f440 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
2f450 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43     }.  .    /* C
2f460 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20  reate a divider 
2f470 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
2f480 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65  nto pParent. The
2f490 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2f4a0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66    ** consists of
2f4b0 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e   a 4-byte page n
2f4c0 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20  umber (the page 
2f4d0 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29  number of pPage)
2f4e0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61   and.    ** a va
2f4f0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
2f500 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d  y value (which m
2f510 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
2f520 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20  value as the.   
2f530 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20   ** largest key 
2f540 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a  on pPage)..    *
2f550 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64  *.    ** To find
2f560 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2f570 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c   value on pPage,
2f580 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20   first find the 
2f590 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20  right-most .    
2f5a0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2f5b0 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
2f5c0 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63  fields of this c
2f5d0 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20  ell are the .   
2f5e0 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74   ** record-lengt
2f5f0 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  h (a variable le
2f600 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20  ngth integer at 
2f610 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20  most 32-bits in 
2f620 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64  size).    ** and
2f630 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28   the key value (
2f640 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f650 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68  h integer, may h
2f660 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a  ave any value)..
2f670 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2f680 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e   of the while(..
2f690 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73  .) loops below s
2f6a0 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65  kips over the re
2f6b0 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20  cord-length.    
2f6c0 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65  ** field. The se
2f6d0 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20  cond while(...) 
2f6e0 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20  loop copies the 
2f6f0 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  key value from t
2f700 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  he.    ** cell o
2f710 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65  n pPage into the
2f720 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a   pSpace buffer..
2f730 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c      */.    pCell
2f740 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2f750 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
2f760 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
2f770 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2f780 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
2f790 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2f7a0 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
2f7b0 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2f7c0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
2f7d0 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
2f7e0 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
2f7f0 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
2f800 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
2f810 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2f820 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  l into pParent. 
2f830 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  */.    insertCel
2f840 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65  l(pParent, pPare
2f850 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63  nt->nCell, pSpac
2f860 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  e, (int)(pOut-pS
2f870 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20  pace),.         
2f880 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e        0, pPage->
2f890 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20  pgno, &rc);..   
2f8a0 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2f8b0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2f8c0 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2f8d0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2f8e0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2f8f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2f900 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2f910 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2f920 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2f930 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2f940 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2f950 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2f960 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2f970 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2f980 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2f990 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2f9a0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2f9b0 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2f9c0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2f9d0 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2f9e0 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2f9f0 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2fa00 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2fa10 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2fa20 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2fa30 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2fa40 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2fa50 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2fa60 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2fa70 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2fa80 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2fa90 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2faa0 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2fab0 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2fac0 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2fad0 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2fae0 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2faf0 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2fb00 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2fb10 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2fb20 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2fb30 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2fb40 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2fb50 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2fb60 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2fb70 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2fb80 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2fb90 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2fba0 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2fbb0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
2fbc0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
2fbd0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
2fbe0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2fbf0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2fc00 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
2fc10 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
2fc20 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
2fc30 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
2fc40 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
2fc50 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2fc60 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2fc70 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
2fc80 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2fc90 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2fca0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
2fcb0 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2fcc0 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
2fcd0 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2fce0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2fcf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fd00 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2fd10 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2fd20 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
2fd30 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
2fd40 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2fd50 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2fd60 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2fd70 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2fd80 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
2fd90 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2fda0 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2fdb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2fdc0 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2fdd0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2fde0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2fdf0 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2fe00 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2fe10 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2fe20 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
2fe30 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
2fe40 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
2fe50 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
2fe60 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
2fe70 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
2fe80 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
2fe90 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
2fea0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
2feb0 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
2fec0 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
2fed0 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
2fee0 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
2fef0 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
2ff00 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
2ff10 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
2ff20 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
2ff30 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
2ff40 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
2ff50 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
2ff60 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
2ff70 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
2ff80 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
2ff90 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
2ffa0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
2ffb0 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
2ffc0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
2ffd0 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
2ffe0 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
2fff0 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
30000 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72  mPage.aOvfl[] ar
30010 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
30020 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
30030 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
30040 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
30050 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
30060 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
30070 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
30080 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
30090 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
300a0 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
300b0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
300c0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
300d0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
300e0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
300f0 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
30100 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
30110 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
30120 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
30130 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
30140 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
30150 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
30160 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
30170 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
30180 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
30190 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
301a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
301b0 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
301c0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
301d0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
301e0 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
301f0 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
30200 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
30210 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
30220 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
30230 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
30240 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
30250 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
30260 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
30270 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
30280 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
30290 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
302a0 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
302b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
302c0 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
302d0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
302e0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
302f0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
30300 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
30310 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
30320 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
30330 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
30340 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
30350 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
30360 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
30370 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
30380 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
30390 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
303a0 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
303b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
303c0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
303d0 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
303e0 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
303f0 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
30400 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
30410 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
30420 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
30430 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
30440 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30450 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
30460 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
30470 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
30480 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
30490 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
304a0 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
304b0 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
304c0 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
304d0 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
304e0 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
304f0 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
30500 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
30510 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
30520 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
30530 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
30540 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
30550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
30570 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
30580 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
30590 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
305a0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
305b0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
305c0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
305d0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
305e0 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
305f0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
30600 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
30610 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
30620 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
30630 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
30640 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
30650 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
30660 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
30670 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
30680 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
30690 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
306a0 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
306b0 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
306c0 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
306d0 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
306e0 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
306f0 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
30700 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
30710 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
30720 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
30730 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
30740 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
30750 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
30760 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
30770 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
30780 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
30790 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
307a0 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
307b0 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
307c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
307d0 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
307e0 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
307f0 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
30800 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
30810 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
30820 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
30830 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
30840 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
30850 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
30860 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
30870 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
30880 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
30890 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
308a0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
308b0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
308c0 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
308d0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
308e0 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
308f0 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
30900 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
30910 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
30920 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
30930 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
30940 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
30950 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
30960 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
30970 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
30980 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
30990 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
309a0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
309b0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
309c0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
309d0 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
309e0 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
309f0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
30a00 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
30a10 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
30a20 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
30a30 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
30a40 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
30a50 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
30a60 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
30a70 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
30a80 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
30a90 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
30aa0 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
30ab0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
30ac0 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
30ad0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30ae0 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
30af0 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
30b00 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30b10 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
30b20 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
30b30 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
30b40 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
30b50 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
30b60 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
30b70 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
30b80 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
30b90 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
30ba0 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
30bb0 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
30bc0 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
30bd0 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
30be0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
30bf0 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
30c00 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
30c10 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
30c20 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
30c30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
30c40 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
30c50 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
30c60 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
30c70 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
30c80 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30c90 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
30ca0 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
30cb0 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62  to a.** buffer b
30cc0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
30cd0 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77  d one page. If w
30ce0 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63  hile inserting c
30cf0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
30d00 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50  rent.** page (pP
30d10 61 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e  arent) the paren
30d20 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
30d30 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
30d40 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
30d50 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
30d60 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63  ent's overflow c
30d70 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68  ells. Because th
30d80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65  is function inse
30d90 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d  rts.** a maximum
30da0 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72   of four divider
30db0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
30dc0 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64  parent page, and
30dd0 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
30de0 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73  size of a cell s
30df0 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20  tored within an 
30e00 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
30e10 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61   always less tha
30e20 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20  n 1/4.** of the 
30e30 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61  page-size, the a
30e40 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66  OvflSpace[] buff
30e50 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
30e60 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
30e70 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f  enough for all o
30e80 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
30e90 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61  *.** If aOvflSpa
30ea0 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ce is set to a n
30eb0 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ull pointer, thi
30ec0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30ed0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ns .** SQLITE_NO
30ee0 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
30ef0 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
30f00 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ot(.  MemPage *p
30f10 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
30f20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
30f30 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73  page of siblings
30f40 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
30f50 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
30f60 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
30f70 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
30f80 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70   "the page" in p
30f90 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
30fa0 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20  aOvflSpace,     
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
30fc0 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f  age-size bytes o
30fd0 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65  f space for pare
30fe0 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74  nt ovfl */.  int
30ff0 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20   isRoot         
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31010 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
31020 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a  is a root-page *
31030 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
31040 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
31050 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
31060 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
31070 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
31080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31090 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
310a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
310b0 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
310c0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
310d0 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
310e0 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
310f0 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
31100 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
31110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31120 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31130 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
31140 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
31150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31160 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
31170 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
31180 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
31190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
311a0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
311b0 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
311d0 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
311e0 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
311f0 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
31200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
31210 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31220 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
31230 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74   u16 leafCorrect
31240 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
31250 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
31260 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
31270 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
31280 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
31290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
312a0 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
312b0 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
312c0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
312d0 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
312e0 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
312f0 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
31300 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
31310 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
31320 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
31330 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
31340 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
31350 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
31360 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
31370 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
31380 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
31390 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
313a0 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
313b0 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
313c0 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
313d0 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  e1[] */.  int iO
313e0 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20  vflSpace = 0;   
313f0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31400 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
31410 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20  OvflSpace[] */. 
31420 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20   int szScratch; 
31430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31440 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68   Size of scratch
31450 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65   memory requeste
31460 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
31470 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
31480 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
31490 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
314a0 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ngs */.  MemPage
314b0 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
314c0 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
314d0 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
314e0 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
314f0 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
31500 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
31510 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
31520 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
31530 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75  balancing */.  u
31540 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20  8 *pRight;      
31550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
31560 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e  ocation in paren
31570 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69  t of right-sibli
31580 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ng pointer */.  
31590 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b  u8 *apDiv[NB-1];
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
315b0 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
315c0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
315d0 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
315e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
315f0 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
31600 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
31610 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
31620 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
31630 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
31640 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
31650 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
31660 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
31670 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
31680 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
31690 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
316a0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
316b0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
316c0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
316d0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
316e0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
316f0 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
31700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31710 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
31720 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
31730 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ells */.  Pgno p
31740 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
31750 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76         /* Temp v
31760 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61  ar to store a pa
31770 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a  ge number in */.
31780 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74  .  pBt = pParent
31790 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
317a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
317b0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
317c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
317d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
317e0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
317f0 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30  bPage) );..#if 0
31800 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
31810 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
31820 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
31830 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
31840 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
31850 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20  #endif..  /* At 
31860 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65  this point pPare
31870 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d  nt may have at m
31880 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77  ost one overflow
31890 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20   cell. And if.  
318a0 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  ** this overflow
318b0 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74   cell is present
318c0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
318d0 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a   cell with .  **
318e0 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64   index iParentId
318f0 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f  x. This scenario
31900 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65   comes about whe
31910 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
31920 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28    ** is called (
31930 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d  indirectly) from
31940 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
31950 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ete()..  */.  as
31960 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
31970 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
31980 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31990 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  w==1 );.  assert
319a0 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
319b0 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
319c0 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
319d0 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
319e0 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
319f0 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
31a00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
31a10 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
31a20 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
31a30 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
31a40 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
31a50 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
31a60 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
31a70 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
31a80 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
31a90 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
31aa0 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
31ab0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
31ac0 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
31ad0 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
31ae0 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
31af0 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
31b00 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
31b10 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
31b20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
31b30 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
31b40 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
31b50 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
31b60 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
31b70 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
31b80 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
31b90 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
31ba0 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
31bb0 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
31bc0 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
31bd0 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
31be0 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
31bf0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
31c00 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
31c10 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
31c20 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
31c30 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
31c40 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
31c50 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
31c60 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
31c70 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
31c80 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
31c90 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
31ca0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
31cb0 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
31cc0 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c  Div = 0;.    nOl
31cd0 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65  d = i+1;.  }else
31ce0 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a  {.    nOld = 3;.
31cf0 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49      if( iParentI
31d00 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  dx==0 ){        
31d10 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
31d20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d  nxDiv = 0;.    }
31d30 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74  else if( iParent
31d40 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  Idx==i ){.      
31d50 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20  nxDiv = i-2;.   
31d60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78   }else{.      nx
31d70 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
31d80 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  -1;.    }.    i 
31d90 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  = 2;.  }.  if( (
31da0 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
31db0 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61  >nOverflow)==pPa
31dc0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
31dd0 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61     pRight = &pPa
31de0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
31df0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
31e00 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
31e10 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c  pRight = findCel
31e20 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
31e30 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
31e40 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67  rflow);.  }.  pg
31e50 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52  no = get4byte(pR
31e60 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ight);.  while( 
31e70 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  1 ){.    rc = ge
31e80 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
31e90 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69  , pgno, &apOld[i
31ea0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
31eb0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  {.      memset(a
31ec0 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
31ed0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
31ee0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c  ;.      goto bal
31ef0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
31f00 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c    }.    nMaxCell
31f10 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
31f20 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
31f30 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
31f40 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62  if( (i--)==0 ) b
31f50 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69  reak;..    if( i
31f60 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d  +nxDiv==pParent-
31f70 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26  >aOvfl[0].idx &&
31f80 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
31f90 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44  low ){.      apD
31fa0 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d  iv[i] = pParent-
31fb0 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
31fc0 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
31fd0 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
31fe0 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
31ff0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
32000 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
32010 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
32020 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
32030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32040 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
32050 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
32060 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
32070 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
32080 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
32090 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
320a0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
320b0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
320c0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
320d0 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
320e0 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
320f0 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
32100 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
32110 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
32120 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
32130 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
32140 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
32150 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
32160 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
32170 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
32180 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
32190 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
321a0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
321b0 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
321c0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
321d0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
321e0 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
321f0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
32200 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
32210 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
32220 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
32230 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
32240 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
32250 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
32260 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
32270 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
32280 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
32290 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
322a0 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
322b0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
322c0 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
322d0 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
322e0 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
322f0 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
32300 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
32310 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
32320 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
32330 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
32340 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
32350 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
32360 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
32370 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
32380 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
32390 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62        if( pBt->b
323a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
323b0 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
323c0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
323d0 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
323e0 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
323f0 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
32400 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
32410 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
32420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
32430 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
32440 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
32450 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
32460 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32470 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32480 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
32490 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
324a0 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
324b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
324c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
324d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
324e0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
324f0 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
32500 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
32510 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
32520 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
32530 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
32540 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
32550 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32560 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
32570 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
32580 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
32590 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
325a0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
325b0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
325c0 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
325d0 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
325e0 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
325f0 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
32600 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
32610 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
32620 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
32630 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
32640 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
32650 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
32660 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
32670 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
32680 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
32690 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
326a0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
326b0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
326c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
326d0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
326e0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
326f0 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
32700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
32710 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
32720 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
32730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
32750 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
32760 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32790 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
327a0 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
327b0 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
327c0 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
327d0 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
327e0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
327f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
32800 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32810 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
32820 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
32830 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
32840 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
32850 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
32860 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
32870 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
32880 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
32890 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
328a0 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
328b0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
328c0 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
328d0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
328e0 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
328f0 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
32900 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
32910 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
32920 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
32930 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
32940 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
32950 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
32960 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
32970 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
32980 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
32990 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
329a0 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
329b0 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
329c0 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
329d0 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
329e0 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
329f0 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
32a00 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
32a10 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
32a20 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
32a30 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
32a40 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
32a50 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
32a60 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
32a70 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
32a80 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
32a90 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
32aa0 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
32ab0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
32ac0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
32ad0 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
32ae0 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
32af0 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
32b00 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
32b10 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
32b20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
32b30 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
32b40 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
32b50 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
32b60 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
32b70 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
32b80 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
32b90 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
32ba0 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
32bb0 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
32bc0 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
32bd0 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
32be0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
32bf0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
32c00 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
32c10 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
32c20 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
32c30 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
32c40 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
32c50 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
32c60 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32c70 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
32c80 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
32c90 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
32ca0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
32cb0 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
32cc0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
32cd0 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
32ce0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
32cf0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
32d00 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
32d10 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
32d20 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
32d30 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
32d40 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
32d50 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
32d60 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
32d70 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
32d80 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
32d90 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
32da0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
32db0 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
32dc0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
32dd0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
32de0 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
32df0 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
32e00 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d  w;.    if( pOld-
32e10 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
32e20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
32e30 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
32e40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
32e50 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
32e60 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
32e70 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
32e80 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
32e90 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
32ea0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
32eb0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
32ec0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
32ed0 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
32ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
32ef0 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74  {.      u8 *aDat
32f00 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b  a = pOld->aData;
32f10 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50  .      u16 maskP
32f20 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b  age = pOld->mask
32f30 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20  Page;.      u16 
32f40 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c  cellOffset = pOl
32f50 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  d->cellOffset;. 
32f60 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
32f70 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
32f80 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
32f90 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
32fa0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
32fb0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  Cell] = findCell
32fc0 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61  v2(aData, maskPa
32fd0 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20  ge, cellOffset, 
32fe0 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
32ff0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
33000 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
33010 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
33020 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
33030 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20       }.    }    
33040 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f     .    if( i<nO
33050 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
33060 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
33070 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
33080 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
33090 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
330a0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
330b0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
330c0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
330d0 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
330e0 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
330f0 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
33100 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
33110 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
33120 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
33130 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20  assert( iSpace1 
33140 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
33150 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
33160 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
33170 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
33180 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
33190 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
331a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
331b0 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
331c0 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
331d0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
331e0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
331f0 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
33200 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
33210 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
33220 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
33230 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
33240 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
33250 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
33260 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
33270 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
33280 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
33290 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
332a0 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
332b0 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
332c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
332d0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
332e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
332f0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
33300 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
33310 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
33320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33330 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
33340 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
33350 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
33360 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
33370 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
33380 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
33390 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
333a0 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
333b0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
333c0 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
333d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
333e0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
333f0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
33400 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
33410 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
33420 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
33430 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
33440 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
33450 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
33460 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
33470 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
33480 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
33490 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
334a0 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
334b0 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
334c0 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
334d0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
334e0 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
334f0 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
33500 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
33510 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
33520 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
33530 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
33540 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
33550 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
33560 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
33570 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
33580 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
33590 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
335a0 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
335b0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
335c0 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
335d0 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
335e0 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
335f0 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
33600 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
33610 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
33620 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
33630 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
33640 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
33650 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
33660 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
33670 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
33680 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
33690 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
336a0 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
336b0 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
336c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
336d0 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
336e0 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
336f0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
33700 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
33710 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
33720 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
33730 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
33740 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
33750 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
33760 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
33770 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
33780 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
33790 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
337a0 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
337b0 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
337c0 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
337d0 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
337e0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
337f0 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
33800 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
33810 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
33820 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
33830 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
33840 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
33850 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
33860 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
33870 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
33880 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
33890 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
338a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
338b0 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
338c0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
338d0 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
338e0 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
338f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
33900 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
33910 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
33920 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
33930 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
33940 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
33950 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
33960 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
33970 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
33980 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
33990 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
339a0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
339b0 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
339c0 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
339d0 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
339e0 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
339f0 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
33a00 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
33a10 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
33a20 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
33a30 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
33a40 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
33a50 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
33a60 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
33a70 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
33a80 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
33a90 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
33aa0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
33ab0 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
33ac0 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
33ad0 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
33ae0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
33af0 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
33b00 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
33b10 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
33b20 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
33b30 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
33b40 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
33b50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33b60 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
33b70 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
33b80 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
33b90 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
33ba0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
33bb0 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
33bc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
33bd0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
33be0 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
33bf0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
33c00 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
33c10 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
33c20 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
33c30 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
33c40 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
33c50 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
33c60 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
33c70 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
33c80 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
33c90 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
33ca0 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
33cb0 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
33cc0 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
33cd0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
33ce0 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
33cf0 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
33d00 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
33d10 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
33d20 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
33d30 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
33d40 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
33d50 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
33d60 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
33d70 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
33d80 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
33d90 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
33da0 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
33db0 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
33dc0 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  t page..  **.  *
33dd0 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61  * UPDATE:  The a
33de0 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73  ssert() below is
33df0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
33e00 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
33e10 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20  abase.  ** file 
33e20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65  is corrupt.  The
33e30 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
33e40 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
33e50 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a   reported later.
33e60 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f    ** in this pro
33e70 63 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20  cedure so there 
33e80 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63  is no need to ac
33e90 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20  t upon it now.. 
33ea0 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
33eb0 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
33ec0 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
33ed0 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
33ee0 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65  >nCell==0) );.#e
33ef0 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22  ndif..  TRACE(("
33f00 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
33f10 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
33f20 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
33f30 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
33f40 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
33f50 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
33f60 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
33f70 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
33f80 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
33f90 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
33fa0 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
33fb0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
33fc0 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
33fd0 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
33fe0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33ff0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
34000 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34010 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
34020 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
34030 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
34040 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
34050 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
34060 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
34070 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
34080 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
34090 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
340a0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
340b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
340c0 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
340d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
340e0 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
340f0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
34100 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
34110 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
34120 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
34130 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34140 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
34150 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
34160 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
34170 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
34180 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
34190 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
341a0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
341b0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
341c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
341d0 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
341e0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
341f0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
34200 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
34210 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34220 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
34230 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
34240 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
34250 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
34260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34270 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
34280 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
34290 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
342a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
342b0 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
342c0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
342d0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
342e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
342f0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
34300 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
34310 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
34320 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
34330 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
34340 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
34350 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
34360 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
34370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
34380 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
34390 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
343a0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
343b0 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
343c0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
343d0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
343e0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
343f0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
34400 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
34410 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
34420 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
34430 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
34440 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
34450 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
34460 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
34470 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
34480 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
34490 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
344a0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
344b0 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
344c0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
344d0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
344e0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
344f0 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
34500 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
34510 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
34520 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
34530 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
34540 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
34550 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
34560 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
34570 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
34580 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
34590 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
345a0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
345b0 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
345c0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
345d0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
345e0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
345f0 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
34600 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
34610 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
34620 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
34630 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
34640 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
34650 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
34660 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
34670 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
34680 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
34690 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
346a0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
346b0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
346c0 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
346d0 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
346e0 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
346f0 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
34700 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
34710 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
34720 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
34730 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
34740 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
34750 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
34760 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
34770 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
34780 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
34790 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
347a0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
347b0 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
347c0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
347d0 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
347e0 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
347f0 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
34800 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
34810 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
34820 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34830 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34840 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
34850 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
34860 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
34870 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
34880 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
34890 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
348a0 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
348b0 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
348c0 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
348d0 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
348e0 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
348f0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
34900 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
34910 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
34920 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
34930 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
34940 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
34950 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
34960 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
34970 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
34980 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
34990 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
349a0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
349b0 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
349c0 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
349d0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
349e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
349f0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
34a00 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
34a10 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
34a20 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
34a30 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
34a40 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
34a50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
34a60 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
34a70 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
34a80 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
34a90 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
34aa0 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
34ab0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
34ac0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
34ad0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
34ae0 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
34af0 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
34b00 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
34b10 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
34b20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
34b30 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
34b40 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
34b50 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
34b60 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
34b70 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
34b80 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
34b90 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
34ba0 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
34bb0 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
34bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
34bd0 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
34be0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
34bf0 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
34c00 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
34c10 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
34c20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
34c30 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
34c40 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
34c50 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
34c60 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
34c70 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
34c80 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
34c90 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
34ca0 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
34cb0 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
34cc0 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
34cd0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
34ce0 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
34cf0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
34d00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
34d10 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
34d20 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
34d30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34d40 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
34d50 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
34d60 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
34d70 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
34d80 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
34d90 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
34da0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
34db0 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
34dc0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
34dd0 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
34de0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
34df0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34e00 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
34e10 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
34e20 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
34e30 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
34e40 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
34e50 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
34e60 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
34e70 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
34e80 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
34e90 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
34ea0 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
34eb0 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
34ec0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
34ed0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
34ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
34ef0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
34f00 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
34f10 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
34f20 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
34f30 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
34f40 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
34f50 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
34f60 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
34f70 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
34f80 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
34f90 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
34fa0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
34fb0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
34fc0 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
34fd0 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
34fe0 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
34ff0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
35000 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
35010 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
35020 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
35030 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
35040 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
35050 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
35060 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
35070 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
35080 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
35090 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
350a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
350b0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
350c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
350d0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
350e0 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
350f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35100 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
35110 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
35120 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
35130 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
35140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
35150 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
35160 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
35170 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
35180 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
35190 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
351a0 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
351b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
351c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
351d0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
351e0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
351f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35200 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
35210 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
35220 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
35230 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
35240 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
35250 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
35260 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
35270 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
35280 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
35290 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
352a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
352b0 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
352c0 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
352d0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
352e0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
352f0 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
35300 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
35310 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
35320 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
35330 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
35340 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
35350 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
35360 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
35370 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
35380 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
35390 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
353a0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
353b0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
353c0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
353d0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
353e0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
353f0 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
35400 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
35410 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
35420 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
35430 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
35440 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
35450 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
35460 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
35470 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
35480 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
35490 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
354a0 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
354b0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
354c0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
354d0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
354e0 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
354f0 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
35500 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
35510 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
35520 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
35530 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
35540 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
35550 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
35560 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
35570 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
35580 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
35590 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
355a0 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
355b0 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
355c0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
355d0 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
355e0 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
355f0 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
35600 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
35610 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
35620 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
35630 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
35640 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
35650 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
35660 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
35670 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
35680 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
35690 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
356a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
356b0 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
356c0 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
356d0 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
356e0 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
356f0 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
35700 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
35710 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
35720 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
35730 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
35740 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
35750 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
35760 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
35770 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
35780 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
35790 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
357a0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
357b0 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
357c0 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
357d0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
357e0 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
357f0 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
35800 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
35810 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
35820 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
35830 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
35840 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
35850 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
35860 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
35870 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
35880 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
35890 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
358a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
358b0 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
358c0 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
358d0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
358e0 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
358f0 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
35900 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35910 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
35920 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
35930 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
35940 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
35950 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
35960 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
35970 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
35980 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
35990 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
359a0 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
359b0 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
359c0 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
359d0 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
359e0 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
359f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
35a00 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
35a10 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
35a20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
35a30 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
35a40 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
35a50 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
35a60 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
35a70 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
35a80 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
35a90 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
35aa0 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
35ab0 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
35ac0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
35ad0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
35ae0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
35af0 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
35b00 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
35b10 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
35b20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
35b30 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
35b40 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
35b50 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
35b60 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
35b70 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
35b80 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
35b90 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
35ba0 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
35bb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
35bc0 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
35bd0 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
35be0 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
35bf0 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
35c00 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
35c10 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
35c20 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
35c30 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
35c40 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
35c50 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35c60 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35c70 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
35c80 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
35c90 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
35ca0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
35cb0 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
35cc0 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
35cd0 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
35ce0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
35cf0 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
35d00 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
35d10 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
35d20 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
35d30 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
35d40 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
35d50 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
35d60 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
35d70 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
35d80 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
35d90 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
35da0 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
35db0 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
35dc0 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
35dd0 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
35de0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
35df0 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
35e00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
35e10 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
35e20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
35e30 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
35e40 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
35e50 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
35e60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
35e70 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
35e80 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
35e90 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
35ea0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
35eb0 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
35ec0 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
35ed0 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
35ee0 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
35ef0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35f00 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
35f10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f30 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
35f40 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
35f50 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
35f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
35f80 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
35f90 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
35fa0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
35fb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
35fc0 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
35fd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
35fe0 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
35ff0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
36000 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
36010 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
36020 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
36030 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
36040 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
36050 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
36060 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
36070 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
36080 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
36090 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
360a0 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
360b0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
360c0 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61  sert( j+1 < Arra
360d0 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b  ySize(apCopy) );
360e0 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
360f0 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
36100 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
36110 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
36120 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
36130 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
36140 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
36150 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
36160 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
36170 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
36180 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
36190 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
361a0 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
361b0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20  >aOvfl[0].idx;. 
361c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
361d0 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
361e0 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
361f0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
36200 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
36210 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
36220 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
36230 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
36240 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[0].idx==pO
36250 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
36260 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1);.      asser
36270 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c  t(nOverflow<3 ||
36280 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e   pOld->aOvfl[1].
36290 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
362a0 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [2].idx-1);.    
362b0 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
362c0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
362d0 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
362e0 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
362f0 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
36300 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
36310 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
36320 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
36330 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
36340 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
36350 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
36360 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
36370 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
36380 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
36390 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
363a0 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
363b0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
363c0 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
363d0 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
363e0 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
363f0 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
36400 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
36410 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
36420 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
36430 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
36440 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
36450 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
36460 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
36470 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
36480 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36490 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
364a0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
364b0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
364c0 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
364d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
364e0 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
364f0 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
36500 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
36510 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
36520 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
36530 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
36540 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
36550 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
36560 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
36570 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
36580 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
36590 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
365a0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
365b0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
365c0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
365d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
365e0 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
365f0 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
36600 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
36610 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
36620 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
36630 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
36640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36650 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
36660 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
36670 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
36680 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
36690 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
366a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
366b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
366c0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
366d0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
366e0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
366f0 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
36700 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
36710 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
36720 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
36730 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
36740 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
36750 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
36760 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
36770 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
36780 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
36790 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
367a0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
367b0 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
367c0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
367d0 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
367e0 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
367f0 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
36800 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
36810 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
36820 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
36830 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
36840 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
36850 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
36860 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
36870 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
36880 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
36890 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
368a0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
368b0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
368c0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
368d0 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
368e0 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
368f0 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
36900 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
36910 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
36920 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
36930 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
36940 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
36950 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
36960 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
36970 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
36980 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
36990 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
369a0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
369b0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
369c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
369d0 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
369e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
369f0 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
36a00 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
36a10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
36a20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
36a30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
36a40 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
36a50 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
36a60 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
36a70 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
36a80 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
36a90 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
36aa0 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
36ab0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
36ac0 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
36ad0 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
36ae0 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
36af0 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
36b00 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
36b10 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
36b20 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
36b30 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
36b40 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
36b50 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
36b60 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
36b70 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
36b80 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
36b90 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
36ba0 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
36bb0 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
36bc0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
36bd0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
36be0 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
36bf0 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
36c00 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
36c10 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
36c20 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
36c30 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
36c40 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
36c50 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
36c60 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
36c70 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
36c80 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
36c90 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
36ca0 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
36cb0 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
36cc0 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
36cd0 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
36ce0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
36cf0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
36d00 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
36d10 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
36d20 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
36d30 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
36d40 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
36d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
36d60 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
36d70 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
36d80 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
36d90 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
36da0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
36db0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
36dc0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
36dd0 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
36de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36df0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36e00 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
36e10 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
36e20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
36e30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
36e40 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
36e50 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
36e60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
36e70 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
36e80 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36e90 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
36ea0 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
36eb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
36ec0 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
36ed0 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
36ee0 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
36ef0 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
36f00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
36f10 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
36f20 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
36f30 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
36f40 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
36f50 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
36f60 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
36f70 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
36f80 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36f90 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
36fa0 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
36fb0 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
36fc0 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
36fd0 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
36fe0 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
36ff0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
37000 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37010 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
37020 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
37030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37040 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
37050 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
37060 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
37070 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
37080 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
37090 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
370a0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
370b0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
370c0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
370d0 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
370e0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
370f0 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
37100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
37110 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
37120 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
37130 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
37140 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
37150 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
37160 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37170 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
37180 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
37190 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
371a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
371b0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
371c0 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
371d0 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
371e0 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
371f0 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
37200 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
37210 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
37220 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
37230 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
37240 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
37250 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
37260 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
37270 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
37280 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
37290 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
372a0 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
372b0 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
372c0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
372d0 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
372e0 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
372f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
37300 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
37310 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
37320 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
37330 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
37340 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
37350 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
37360 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
37370 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
37380 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
37390 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
373a0 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
373b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
373c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
373d0 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
373e0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
373f0 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
37400 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
37410 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
37420 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
37430 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
37440 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
37450 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
37460 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
37470 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
37480 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
37490 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
374a0 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
374b0 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
374c0 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
374d0 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
374e0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
374f0 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
37500 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
37510 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
37520 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
37530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37540 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
37550 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
37560 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
37570 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
37580 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
37590 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
375a0 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
375b0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
375c0 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
375d0 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
375e0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
375f0 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
37600 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
37610 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
37620 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
37630 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
37640 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
37650 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
37660 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
37670 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
37680 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
37690 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
376a0 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
376b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
376c0 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
376d0 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
376e0 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
376f0 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
37700 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
37710 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
37720 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
37730 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
37740 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
37750 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
37760 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
37770 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
37780 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
37790 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
377a0 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
377b0 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
377c0 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
377d0 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
377e0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
377f0 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
37800 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
37810 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37830 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
37840 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
37850 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
37860 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
37870 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
37880 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
37890 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
378a0 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
378b0 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
378c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
378d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
378e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
378f0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
37900 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
37910 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
37920 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
37940 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
37950 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
37960 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
37970 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
37980 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
37990 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
379a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
379b0 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
379c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
379d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
379e0 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  _OK ){.#ifndef S
379f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
37a00 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20  BALANCE.        
37a10 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
37a20 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ta.         && p
37a30 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
37a40 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
37a50 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
37a60 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
37a70 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37a80 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20  rent->pgno!=1.  
37a90 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
37aa0 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20  t->nCell==iIdx. 
37ab0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37ac0 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61      /* Call bala
37ad0 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63  nce_quick() to c
37ae0 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c  reate a new sibl
37af0 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20  ing of pPage on 
37b00 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20  which.          
37b10 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
37b20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62  overflow cell. b
37b30 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
37b40 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c  nserts a new cel
37b50 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  l.          ** i
37b60 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69  nto pParent, whi
37b70 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
37b80 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49  rent overflow. I
37b90 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
37ba0 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
37bb0 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e   next interation
37bc0 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
37bd0 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61  will balance pPa
37be0 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  rent .          
37bf0 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61  ** use either ba
37c00 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
37c10 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  or balance_deepe
37c20 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a  r(). Until this.
37c30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
37c40 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c  pens, the overfl
37c50 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65  ow cell is store
37c60 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63  d in the aBalanc
37c70 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20  eQuickSpace[].  
37c80 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
37c90 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  r. .          **
37ca0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
37cb0 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
37cc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37cd0 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20  t() is to check 
37ce0 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20  that only a.    
37cf0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
37d00 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
37d10 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20  quick() is made 
37d20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
37d30 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
37d40 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  ** function. If 
37d50 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65  this were not ve
37d60 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65  rified, a subtle
37d70 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72   bug involving r
37d80 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  euse.          *
37d90 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63  * of the aBalanc
37da0 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69  eQuickSpace[] mi
37db0 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20  ght sneak in..  
37dc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37dd0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
37de0 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
37df0 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
37e00 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
37e10 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74  ce_quick(pParent
37e20 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63  , pPage, aBalanc
37e30 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20  eQuickSpace);.  
37e40 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
37e50 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
37e60 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
37e70 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c  s case, call bal
37e80 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74  ance_nonroot() t
37e90 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63  o redistribute c
37ea0 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
37eb0 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20  * between pPage 
37ec0 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69  and up to 2 of i
37ed0 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ts sibling pages
37ee0 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a  . This involves.
37ef0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64            ** mod
37f00 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
37f10 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20  nts of pParent, 
37f20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
37f30 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20  pParent to.     
37f40 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f       ** become o
37f50 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
37f60 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69  full. The next i
37f70 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37f80 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20  do-loop.        
37f90 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63    ** will balanc
37fa0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
37fb0 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69  e to correct thi
37fc0 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
37fd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
37fe0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37ff0 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
38000 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  l, the overflow 
38010 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20  cell or cells.  
38020 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73          ** are s
38030 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70  tored in the pSp
38040 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  ace buffer alloc
38050 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
38060 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20   below. .       
38070 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65     ** A subseque
38080 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  nt iteration of 
38090 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
380a0 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20   deal with this 
380b0 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
380c0 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f  calling balance_
380d0 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e  nonroot() (balan
380e0 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20  ce_deeper() may 
380f0 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c  be called first,
38100 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
38110 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61  t it doesn't dea
38120 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  l with overflow 
38130 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76  cells - just mov
38140 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20  es them to a.   
38150 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72         ** differ
38160 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20  ent page). Once 
38170 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20  this subsequent 
38180 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
38190 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20  nonroot() .     
381a0 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70       ** has comp
381b0 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66  leted, it is saf
381c0 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
381d0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
381e0 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20  sed by.         
381f0 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73   ** the previous
38200 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76   call, as the ov
38210 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61  erflow cell data
38220 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
38230 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
38240 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f  pied either into
38250 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64   the body of a d
38260 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20  atabase page or 
38270 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
38280 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65         ** pSpace
38290 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
382a0 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c  o the latter cal
382b0 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
382c0 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20  root()..        
382d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
382e0 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69  8 *pSpace = sqli
382f0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43  te3PageMalloc(pC
38300 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
38310 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
38320 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f   = balance_nonro
38330 6f 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ot(pParent, iIdx
38340 2c 20 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d  , pSpace, iPage=
38350 3d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  =1);.          i
38360 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
38370 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46          /* If pF
38380 72 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ree is not NULL,
38390 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
383a0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
383b0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 20 20  used .          
383c0 20 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f    ** by a previo
383d0 75 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  us call to balan
383e0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74  ce_nonroot(). It
383f0 73 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20  s contents are. 
38400 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f             ** no
38410 77 20 73 74 6f 72 65 64 20 65 69 74 68 65 72 20  w stored either 
38420 6f 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73 65  on real database
38430 20 70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e   pages or within
38440 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
38450 20 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20    ** new pSpace 
38460 62 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61  buffer, so it ma
38470 79 20 62 65 20 73 61 66 65 6c 79 20 66 72 65 65  y be safely free
38480 64 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  d here. */.     
38490 20 20 20 20 20 20 20 73