/ Hex Artifact Content
Login

Artifact bc2099e7d3c22c52b2c54349b9c07c04f2a810d0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
2140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
2150: 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
2160: 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72  (p->db, pBt->pWr
2170: 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72  iter->db);.    r
2180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
2190: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
21a0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65  .  }..  for(pIte
21b0: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
21c0: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
21d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
21e0: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
21f0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2200: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2210: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2220: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
2230: 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61 74  is a simplificat
2240: 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  ion of:.    **. 
2250: 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d     **   (eLock==
2260: 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49  WRITE_LOCK || pI
2270: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54  ter->eLock==WRIT
2280: 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20  E_LOCK).    **. 
2290: 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b     ** since we k
22a0: 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f 63  now that if eLoc
22b0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74  k==WRITE_LOCK, t
22c0: 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hen no other con
22d0: 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d  nection.    ** m
22e0: 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45 5f  ay hold a WRITE_
22f0: 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c  LOCK on any tabl
2300: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 28  e in this file (
2310: 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e 0a  since there can.
2320: 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61      ** only be a
2330: 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e   single writer).
2340: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
2350: 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b  rt( pIter->eLock
2360: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2370: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2380: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  TE_LOCK );.    a
2390: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
23a0: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  AD_LOCK || pIter
23b0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70  ->pBtree==p || p
23c0: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41  Iter->eLock==REA
23d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
23e0: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
23f0: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
2400: 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74 65  le==iTab && pIte
2410: 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20  r->eLock!=eLock 
2420: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2430: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2440: 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e  d(p->db, pIter->
2450: 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20  pBtree->db);.   
2460: 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52     if( eLock==WR
2470: 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  ITE_LOCK ){.    
2480: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
2490: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
24a0: 20 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65         pBt->isPe
24b0: 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  nding = 1;.     
24c0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
24d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
24e0: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d  AREDCACHE;.    }
24f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2500: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2510: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2520: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2530: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2540: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2550: 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  CHE./*.** Add a 
2560: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
2570: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2580: 20 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73   iTable to the s
2590: 68 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64  hared-btree used
25a0: 0a 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e  .** by Btree han
25b0: 64 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72  dle p. Parameter
25c0: 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65   eLock must be e
25d0: 69 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20  ither READ_LOCK 
25e0: 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43  or .** WRITE_LOC
25f0: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  K..**.** This fu
2600: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2620: 0a 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70  .**   (a) The sp
2630: 65 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62  ecified Btree ob
2640: 6a 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63  ject p is connec
2650: 74 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c  ted to a sharabl
2660: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
2670: 61 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68  ase (one with th
2680: 65 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61  e BtShared.shara
2690: 62 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61  ble flag set), a
26a0: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e  nd.**.**   (b) N
26b0: 6f 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62  o other Btree ob
26c0: 6a 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63  jects hold a loc
26d0: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
26e0: 0a 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74  .**       with t
26f0: 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
2700: 6b 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61  k (i.e. querySha
2710: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2720: 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20  k() has.**      
2730: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2740: 6c 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  lled and returne
2750: 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a  d SQLITE_OK)..**
2760: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2770: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2780: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2790: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
27a0: 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73  ITE_NOMEM .** is
27b0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
27c0: 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61  alloc attempt fa
27d0: 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
27e0: 6e 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68  nt setSharedCach
27f0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
2800: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65   *p, Pgno iTable
2810: 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42  , u8 eLock){.  B
2820: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2830: 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20  ->pBt;.  BtLock 
2840: 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  *pLock = 0;.  Bt
2850: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
2860: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2870: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2890: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
28a0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
28b0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
28c0: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20  ( p->db!=0 );.. 
28d0: 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e   /* A connection
28e0: 20 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75   with the read-u
28f0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2900: 73 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74  set will never t
2910: 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69  ry to.  ** obtai
2920: 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73  n a read-lock us
2930: 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2940: 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64  n. The only read
2950: 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20  -lock obtained. 
2960: 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74   ** by a connect
2970: 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f  ion in read-unco
2980: 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20  mmitted mode is 
2990: 6f 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  on the sqlite_ma
29a0: 73 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65  ster .  ** table
29b0: 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20  , and that lock 
29c0: 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42  is obtained in B
29d0: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29  treeBeginTrans()
29e0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29f0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
2a00: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
2a10: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65 4c 6f 63  mmitted) || eLoc
2a20: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2a30: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2a40: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
2a50: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
2a60: 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65 20  sharable b-tree 
2a70: 61 66 74 65 72 20 69 74 20 0a 20 20 2a 2a 20 68  after it .  ** h
2a80: 61 73 20 62 65 65 6e 20 64 65 74 65 72 6d 69 6e  as been determin
2a90: 65 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ed that no other
2aa0: 20 62 2d 74 72 65 65 20 68 6f 6c 64 73 20 61 20   b-tree holds a 
2ab0: 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b  conflicting lock
2ac0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2ad0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 3b 0a 20  p->sharable );. 
2ae0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2af0: 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72 65 64 43  OK==querySharedC
2b00: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
2b10: 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b 29 20   iTable, eLock) 
2b20: 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 73  );..  /* First s
2b30: 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 66  earch the list f
2b40: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6c  or an existing l
2b50: 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  ock on this tabl
2b60: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65  e. */.  for(pIte
2b70: 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
2b80: 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
2b90: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2ba0: 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  ( pIter->iTable=
2bb0: 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65 72  =iTable && pIter
2bc0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
2bd0: 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74       pLock = pIt
2be0: 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  er;.      break;
2bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2c00: 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73 65   If the above se
2c10: 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69 6e  arch did not fin
2c20: 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75 63  d a BtLock struc
2c30: 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42 74  t associating Bt
2c40: 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68 20  ree p.  ** with 
2c50: 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c  table iTable, al
2c60: 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c  locate one and l
2c70: 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ink it into the 
2c80: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2c90: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   !pLock ){.    p
2ca0: 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a  Lock = (BtLock *
2cb0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
2cc0: 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b  ro(sizeof(BtLock
2cd0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c 6f  ));.    if( !pLo
2ce0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ck ){.      retu
2cf0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b  .    }.    pLock
2d10: 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62 6c  ->iTable = iTabl
2d20: 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42  e;.    pLock->pB
2d30: 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c  tree = p;.    pL
2d40: 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ock->pNext = pBt
2d50: 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74  ->pLock;.    pBt
2d60: 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b  ->pLock = pLock;
2d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
2d80: 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20  he BtLock.eLock 
2d90: 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20  variable to the 
2da0: 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20 63  maximum of the c
2db0: 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a  urrent lock.  **
2dc0: 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
2dd0: 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65  ed lock. This me
2de0: 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d 6c  ans if a write-l
2df0: 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79 20  ock was already 
2e00: 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20  held.  ** and a 
2e10: 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73  read-lock reques
2e20: 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e  ted, we don't in
2e30: 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67 72  correctly downgr
2e40: 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20  ade the lock..  
2e50: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52 49  */.  assert( WRI
2e60: 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43  TE_LOCK>READ_LOC
2e70: 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b  K );.  if( eLock
2e80: 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b  >pLock->eLock ){
2e90: 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  .    pLock->eLoc
2ea0: 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a  k = eLock;.  }..
2eb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2ed0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2ee0: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2ef0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2f10: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c  *.** Release all
2f20: 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73   the table locks
2f30: 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64   (locks obtained
2f40: 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a   via calls to.**
2f50: 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43 61   the setSharedCa
2f60: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 70  cheTableLock() p
2f70: 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62  rocedure) held b
2f80: 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70  y Btree object p
2f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2fa0: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2fb0: 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20 61  at Btree p has a
2fc0: 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20 77  n open read or w
2fd0: 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63  rite .** transac
2fe0: 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65 73  tion. If it does
2ff0: 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 42   not, then the B
3000: 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e  tShared.isPendin
3010: 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61  g variable.** ma
3020: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3030: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3040: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3050: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3060: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3070: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3080: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3090: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
30a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
30b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
30c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
30d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
30f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3100: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3110: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3120: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3130: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3140: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3150: 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63 6c 75  rt( pBt->isExclu
3160: 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  sive==0 || pBt->
3170: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
3180: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
3190: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31a0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31b0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31c0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31d0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
31e0: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
31f0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3200: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3210: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3220: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3230: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3240: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3250: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3260: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3280: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
3290: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42   }..  assert( pB
32b0: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d 30 20  t->isPending==0 
32c0: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20  || pBt->pWriter 
32d0: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  );.  if( pBt->pW
32e0: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
32f0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30  pBt->pWriter = 0
3300: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63  ;.    pBt->isExc
3310: 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20  lusive = 0;.    
3320: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3330: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
3340: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3350: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3360: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3370: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
3380: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
3390: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33b0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33c0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
33d0: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
33e0: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
33f0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3400: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3410: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3420: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3430: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3440: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3450: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3460: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
3470: 20 74 68 65 20 69 73 50 65 6e 64 69 6e 67 20 66   the isPending f
3480: 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a  lag to 0..    **
3490: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
34a0: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
34b0: 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e  y a writer, then
34c0: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
34d0: 69 6e 67 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ing must.    ** 
34e0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
34f0: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3500: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3510: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3520: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   */.    pBt->isP
3530: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a  ending = 0;.  }.
3540: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3550: 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61  nction changes a
3560: 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68  ll write-locks h
3570: 65 6c 64 20 62 79 20 42 74 72 65 65 20 70 20 69  eld by Btree p i
3580: 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a  nto read-locks..
3590: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
35a0: 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
35b0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
35c0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
35d0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35e0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d  >pBt;.  if( pBt-
35f0: 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20  >pWriter==p ){. 
3600: 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b     BtLock *pLock
3610: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  ;.    pBt->pWrit
3620: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3630: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
3640: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
3650: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ding = 0;.    fo
3660: 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f  r(pLock=pBt->pLo
3670: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
3680: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
3690: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
36a0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ock->eLock==READ
36b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e  _LOCK || pLock->
36c0: 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20  pBtree==p );.   
36d0: 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20     pLock->eLock 
36e0: 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20  = READ_LOCK;.   
36f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66   }.  }.}..#endif
3700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
3710: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
3730: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
3740: 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f   *pPage);  /* Fo
3750: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
3760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69  */../*.***** Thi
3770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
3780: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
3790: 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a  rt() only ****.*
37a0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
37b0: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
37c0: 73 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69  s the mutex on i
37d0: 74 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23  ts BtShared.*/.#
37e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
37f0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75  UG.static int cu
3800: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42  rsorHoldsMutex(B
3810: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72  tCursor *p){.  r
3820: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
3830: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d  tex_held(p->pBt-
3840: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
3850: 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  f...#ifndef SQLI
3860: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
3870: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3880: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
3890: 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66  age-list cache f
38a0: 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20  or cursor pCur, 
38b0: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
38c0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
38d0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  eOverflowCache(B
38e0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
38f0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
3900: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
3910: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   );.  sqlite3_fr
3920: 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
3930: 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76  ow);.  pCur->aOv
3940: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f  erflow = 0;.}../
3950: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3960: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3970: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3980: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3990: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
39a0: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
39b0: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
39c0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
39d0: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
39e0: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
39f0: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3a00: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3a10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3a20: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3a30: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3a40: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3a50: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3a60: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3a70: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
3a80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3a90: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3aa0: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3ab0: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3ac0: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3ad0: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3ae0: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3af0: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3b00: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3b10: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3b20: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3b30: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3b40: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3b50: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3b60: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3b70: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
3b80: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
3b90: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
3ba0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3bb0: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3bc0: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3bd0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3be0: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3bf0: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3c00: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3c10: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3c20: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3c30: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3c40: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
3c50: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
3c60: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
3c70: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
3c80: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
3c90: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
3ca0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
3cb0: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3cd0: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3ce0: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3cf0: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3d00: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3d10: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3d20: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
3d50: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
3d60: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
3d70: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
3d80: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
3d90: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
3da0: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
3db0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
3dc0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
3dd0: 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ee->pBt;.  asser
3de0: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
3df0: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
3e00: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3e10: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3e20: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3e30: 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  f( p->isIncrblob
3e40: 48 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65  Handle && (isCle
3e50: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
3e60: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
3e70: 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74  {.      p->eStat
3e80: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
3e90: 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ID;.    }.  }.}.
3ea0: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62  .#else.  /* Stub
3eb0: 20 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20   functions when 
3ec0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
3ed0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
3ee0: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3ef0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
3f00: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
3f10: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f20: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3f30: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3f40: 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23  Cursors(x,y,z).#
3f50: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3f60: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f  OMIT_INCRBLOB */
3f70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3f80: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3f90: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3fa0: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3fb0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3fc0: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3fd0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3fe0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3ff0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4000: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
4010: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
4020: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
4030: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
4040: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
4050: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
4060: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
4070: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
4080: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
4090: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
40a0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
40b0: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
40c0: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
40d0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
40e0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
40f0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
4100: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
4110: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
4120: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
4130: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
4140: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
4150: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4160: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
4170: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
4180: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
4190: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
41a0: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
41b0: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
41c0: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
41d0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
41e0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
41f0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
4200: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
4210: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4220: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
4230: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
4240: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
4250: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
4260: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
4270: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
4280: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
4290: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
42a0: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
42b0: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
42c0: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
42d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
42e0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
42f0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
4300: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
4310: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
4320: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4330: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4340: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4350: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4360: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4370: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4380: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4390: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
43a0: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
43b0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
43c0: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
43d0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
43e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43f0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
4400: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
4410: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
4420: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4430: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4440: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4450: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4460: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4470: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4480: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4490: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
44a0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
44b0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
44c0: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
44d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
44e0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
44f0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4500: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
4510: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
4520: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4530: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4540: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4550: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4560: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4570: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4580: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4590: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
45a0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
45b0: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
45c0: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74   2 above is omit
45d0: 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65  ted if the corre
45e0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
45f0: 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69  already.** set i
4600: 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  n BtShared.pHasC
4610: 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74  ontent. The cont
4620: 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76  ents of the bitv
4630: 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a  ec are cleared.*
4640: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
4650: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
4660: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4670: 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
4680: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4690: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
46a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
46b0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  _OK;.  if( !pBt-
46c0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
46d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
46e0: 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a  <=pBt->nPage );.
46f0: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4700: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4710: 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e  tvecCreate(pBt->
4720: 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
4730: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4740: 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
4750: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4760: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4770: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4780: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
4790: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
47a0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
47b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
47c0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
47d0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
47e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
47f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4800: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4810: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4820: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4830: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4840: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4850: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4860: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4870: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4880: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
4890: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
48a0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
48b0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
48c0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
48d0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
48e0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
48f0: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4910: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4930: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4940: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4950: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4960: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4970: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4980: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
4990: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
49a0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
49b0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
49c0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49d0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49e0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
49f0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4a00: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4a10: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4a20: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4a30: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4a40: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4a50: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4a60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4a70: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4a80: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
4a90: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
4aa0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
4ab0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
4ac0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
4ad0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
4ae0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4af0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4b00: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4b10: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4b20: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4b30: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
4b40: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
4b50: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
4b60: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
4b70: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
4b80: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
4b90: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
4ba0: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
4bb0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
4bc0: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
4bd0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
4be0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
4bf0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
4c00: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
4c10: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
4c20: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
4c30: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
4c40: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
4c50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4c60: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
4c70: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
4c80: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
4c90: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
4ca0: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
4cb0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
4cc0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
4cd0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
4ce0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
4cf0: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
4d00: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
4d10: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
4d20: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
4d30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
4d40: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
4d50: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
4d60: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
4d70: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
4d80: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
4d90: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
4da0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
4db0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
4dc0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
4dd0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
4de0: 20 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70   if( 0==pCur->ap
4df0: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
4e00: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
4e10: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
4e20: 63 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  c( (int)pCur->nK
4e30: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
4e40: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
4e50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
4e60: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
4e70: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
4e90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ea0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
4eb0: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
4ed0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
4ee0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4ef0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
4f00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
4f20: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
4f30: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
4f40: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
4f50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4f60: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4f70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
4f80: 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
4f90: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
4fa0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4fb0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72  [i]);.      pCur
4fc0: 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
4fd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
4fe0: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20  >iPage = -1;.   
4ff0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5000: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5010: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
5020: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
5030: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
5040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5050: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
5060: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
5070: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
5080: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
5090: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
50a0: 20 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65    with root-page
50b0: 20 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c   iRoot. Usually,
50c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
50d0: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
50e0: 6f 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73  or.** pExcept is
50f0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5100: 74 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65  the table (Btree
5110: 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65  Delete() or Btre
5120: 65 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73  eInsert())..*/.s
5130: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
5140: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
5150: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
5160: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
5170: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
5180: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
5190: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
51a0: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
51b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
51c0: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
51d0: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
51e0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
51f0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
5200: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
5210: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
5220: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
5230: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20  Root==iRoot) && 
5240: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
5250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5260: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
5270: 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
5280: 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
5290: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
52a0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
52b0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
52c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
52e0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
52f0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5300: 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  position..*/.voi
5310: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  d sqlite3BtreeCl
5320: 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73  earCursor(BtCurs
5330: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
5340: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5350: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
5360: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5370: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75  ur->pKey);.  pCu
5380: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70  r->pKey = 0;.  p
5390: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
53a0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a  RSOR_INVALID;.}.
53b0: 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
53c0: 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
53d0: 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
53e0: 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
53f0: 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
5400: 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
5410: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
5420: 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
5430: 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
5440: 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
5450: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
5460: 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
5470: 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rk..*/.static in
5480: 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  t btreeMoveto(. 
5490: 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
54a0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
54b0: 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
54c0: 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
54d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
54e0: 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
54f0: 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
5500: 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
5510: 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
5520: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
5530: 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
5540: 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
5550: 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
5560: 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
5570: 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
5580: 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
5590: 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
55a0: 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
55b0: 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
55c0: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
55d0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55f0: 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
5600: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
5610: 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
5620: 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
5630: 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
5640: 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
5650: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
5660: 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
5670: 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
5680: 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79  c */..  if( pKey
5690: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
56a0: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
56b0: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
56c0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
56d0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
56e0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
56f0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  nt)nKey, pKey,. 
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a       aSpace, siz
5730: 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20  eof(aSpace));.  
5740: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5750: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
5770: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
5780: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5790: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
57a0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
57b0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
57c0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
57d0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  pKey ){.    sqli
57e0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
57f0: 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78  ackedRecord(pIdx
5800: 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
5810: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5820: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5830: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5840: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
5850: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
5860: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
5870: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
5880: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
5890: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
58a0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
58b0: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
58c0: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
58d0: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
58e0: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
58f0: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5900: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5910: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5920: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5930: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5940: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5950: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5960: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5970: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5980: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5990: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
59a0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
59b0: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
59c0: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
59d0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
59e0: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
59f0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5a00: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5a10: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5a20: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5a30: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5a40: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5a50: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5a60: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5a70: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5a80: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5a90: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5ac0: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5ad0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5ae0: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5af0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b00: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5b10: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5b20: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5b30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5b40: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5b50: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5b60: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5b70: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5b80: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5b90: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5ba0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5bb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5bc0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5bd0: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5be0: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5bf0: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5c00: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5c10: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5c20: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5c30: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5c40: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5c50: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5c60: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5c70: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5c90: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5ca0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5cb0: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5cc0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5cd0: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5ce0: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5cf0: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5d00: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5d10: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5d20: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5d30: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5d40: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5d50: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5d60: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5d70: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5d80: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5d90: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5da0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5db0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5dc0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5dd0: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5de0: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5df0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5e00: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5e10: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5e20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5e30: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5e40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5e50: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5e60: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5e70: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5e80: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5e90: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ea0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
5eb0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
5ec0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
5ed0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
5ee0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
5ef0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
5f00: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
5f10: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
5f20: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
5f30: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
5f40: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
5f50: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
5f60: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
5f70: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
5f80: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
5f90: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
5fa0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
5fb0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
5fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
5fd0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
5fe0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
5ff0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6000: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6010: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6020: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6030: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6040: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
6050: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
6060: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
6070: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
6080: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
6090: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
60a0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
60b0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
60c0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
60d0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
60e0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
60f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6100: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6110: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6120: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6130: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6140: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
6150: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
6160: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
6170: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
6180: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
6190: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
61a0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
61b0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
61c0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
61d0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
61e0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
61f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6200: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6210: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6220: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6230: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6240: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
6250: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
6260: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
6270: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
6280: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
6290: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
62a0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
62b0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
62c0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
62d0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
62e0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
62f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6300: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6310: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6320: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6330: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6340: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6350: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
6360: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6370: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
6380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
6390: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
63a0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
63b0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
63c0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
63d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
63e0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
63f0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6400: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6410: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6420: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6430: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6440: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
6450: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
6460: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
6470: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
6480: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
6490: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
64a0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
64b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
64c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
64d0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
64e0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
64f0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6500: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6510: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6520: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6530: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6540: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6550: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
6560: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
6570: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
6580: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
6590: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
65a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
65b0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
65c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
65d0: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
65e0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
65f0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6600: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6610: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6620: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6630: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6640: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
6650: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6660: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6670: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6680: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
6690: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
66a0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
66b0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
66c0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
66d0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
66e0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
66f0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6700: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6710: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6720: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6730: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6740: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6750: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6760: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6770: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6780: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6790: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
67a0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
67b0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
67c0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
67d0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
67e0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
67f0: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6800: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6810: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6820: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6830: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6840: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6850: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6860: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6870: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6880: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
6890: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
68a0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
68b0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
68c0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
68d0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
68e0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
68f0: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6900: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6910: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6920: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6930: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6940: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6950: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6960: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6970: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6980: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6990: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
69a0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
69b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
69c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
69d0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
69e0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
69f0: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6a00: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6a10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a20: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6a30: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6a40: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6a50: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6a60: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6a70: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6a80: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6a90: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6aa0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6ab0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6ac0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6ad0: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6ae0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6af0: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6b00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6b10: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6b20: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6b30: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6b40: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6b50: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6b60: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6b70: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6b80: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6b90: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6ba0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6bb0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6bc0: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6bd0: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6be0: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6c00: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6c10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6c20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6c30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6c40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6c50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6c60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6c70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6c80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6c90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6ca0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6cb0: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6cc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6cd0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6ce0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6cf0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6d00: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6d10: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6d20: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6d30: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6d40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6d50: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
6d60: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
6d70: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
6d80: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
6d90: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
6da0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6db0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
6dc0: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
6dd0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
6de0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
6df0: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44  et2byte(&(P)->aD
6e00: 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66  ata[(P)->cellOff
6e10: 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 23 64  set+2*(I)]))).#d
6e20: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 76 32  efine findCellv2
6e30: 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28 4d 26  (D,M,O,I) (D+(M&
6e40: 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b 32 2a  get2byte(D+(O+2*
6e50: 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20  (I))))).../*.** 
6e60: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
6e70: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
6e80: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
6e90: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
6ea0: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
6eb0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
6ec0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a  ..*/.static u8 *
6ed0: 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c  findOverflowCell
6ee0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
6ef0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69   int iCell){.  i
6f00: 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
6f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6f20: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
6f30: 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69  utex) );.  for(i
6f40: 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  =pPage->nOverflo
6f50: 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  w-1; i>=0; i--){
6f60: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
6f70: 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c  struct _OvflCell
6f80: 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76   *pOvfl;.    pOv
6f90: 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76  fl = &pPage->aOv
6fa0: 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70  fl[i];.    k = p
6fb0: 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69  Ovfl->idx;.    i
6fc0: 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k<=iCell ){. 
6fd0: 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c       if( k==iCel
6fe0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  l ){.        ret
6ff0: 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c  urn pOvfl->pCell
7000: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7010: 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20  iCell--;.    }. 
7020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64   }.  return find
7030: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7040: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  l);.}../*.** Par
7050: 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  se a cell conten
7060: 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c  t block and fill
7070: 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   in the CellInfo
7080: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
7090: 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65  re.** are two ve
70a0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
70b0: 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65 50  unction.  btreeP
70c0: 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73  arseCell() takes
70d0: 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65   a .** cell inde
70e0: 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  x as the second 
70f0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74 72  argument and btr
7100: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
7110: 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69   .** takes a poi
7120: 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79  nter to the body
7130: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20   of the cell as 
7140: 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  its second argum
7150: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  ent..**.** Withi
7160: 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65  n this file, the
7170: 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63   parseCell() mac
7180: 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ro can be called
7190: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
71a0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
71b0: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
71c0: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
71d0: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
71e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
71f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7200: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7210: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
7220: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
7230: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
7240: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
7250: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7260: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
7270: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7280: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7290: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
72a0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
72b0: 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u16 n;          
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
72d0: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
72e0: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
72f0: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
7300: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
7310: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
7320: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
7330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
7340: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7350: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
7360: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
7370: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
7380: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
7390: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
73a0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
73b0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
73c0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
73d0: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
73e0: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
73f0: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
7400: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
7410: 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e  sData ){.      n
7420: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7430: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7440: 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  oad);.    }else{
7450: 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20  .      nPayload 
7460: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  = 0;.    }.    n
7470: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
7480: 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26  Cell[n], (u64*)&
7490: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
74a0: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
74b0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c   nPayload;.  }el
74c0: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
74d0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20  Data = 0;.    n 
74e0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
74f0: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
7500: 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  ad);.    pInfo->
7510: 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  nKey = nPayload;
7520: 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  .  }.  pInfo->nP
7530: 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61  ayload = nPayloa
7540: 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61  d;.  pInfo->nHea
7550: 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74 63  der = n;.  testc
7560: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
7570: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
7580: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
7590: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
75a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
75b0: 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f  f( likely(nPaylo
75c0: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
75d0: 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
75e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
75f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
7600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
7610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
7620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
7630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
7640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
7650: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
7660: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
7670: 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61 64 29  u16)(n+nPayload)
7680: 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  )<4 ) pInfo->nSi
7690: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
76a0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
76b0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70  )nPayload;.    p
76c0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
76d0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
76e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
76f0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
7700: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
7710: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
7720: 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f  e have.    ** to
7730: 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68   decide how much
7740: 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
7750: 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74  y and how much t
7760: 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20  o spill onto.   
7770: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
7780: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
7790: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
77a0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
77b0: 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61  nused.    ** spa
77c0: 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce on overflow p
77d0: 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69  ages while keepi
77e0: 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ng the amount of
77f0: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20   local storage. 
7800: 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e     ** in between
7810: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
7820: 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  xLocal..    **. 
7830: 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20     ** Warning:  
7840: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
7850: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
7860: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
7870: 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77   in any.    ** w
7880: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
7890: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
78a0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
78b0: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69     */.    int mi
78c0: 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69  nLocal;  /* Mini
78d0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
78e0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
78f0: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61  ly */.    int ma
7900: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
7910: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
7920: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
7930: 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75  ly */.    int su
7940: 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72  rplus;   /* Over
7950: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61  flow payload ava
7960: 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c  ilable for local
7970: 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20   storage */..   
7980: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
7990: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
79a0: 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67   maxLocal = pPag
79b0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20  e->maxLocal;.   
79c0: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
79d0: 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20  cal + (nPayload 
79e0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
79f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7a00: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
7a10: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
7a20: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  =maxLocal );.   
7a30: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
7a40: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  us==maxLocal+1 )
7a50: 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c 75  ;.    if( surplu
7a60: 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b  s <= maxLocal ){
7a70: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7a80: 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70  ocal = (u16)surp
7a90: 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lus;.    }else{.
7aa0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f        pInfo->nLo
7ab0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
7ac0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  cal;.    }.    p
7ad0: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7ae0: 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e  = (u16)(pInfo->n
7af0: 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20  Local + n);.    
7b00: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
7b10: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
7b20: 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69  + 4;.  }.}.#defi
7b30: 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61  ne parseCell(pPa
7b40: 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, iCell, pInfo
7b50: 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73 65  ) \.  btreeParse
7b60: 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c  CellPtr((pPage),
7b70: 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65   findCell((pPage
7b80: 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49  ), (iCell)), (pI
7b90: 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f 69  nfo)).static voi
7ba0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
7bb0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7bc0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7bd0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7be0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
7bf0: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
7c00: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
7c10: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
7c20: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
7c30: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
7c40: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7c50: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7c60: 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c  */.){.  parseCel
7c70: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
7c80: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
7c90: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
7ca0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
7cb0: 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e  es that a Cell n
7cc0: 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  eeds in the cell
7cd0: 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66  .** data area of
7ce0: 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e   the btree-page.
7cf0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d    The return num
7d00: 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65  ber includes the
7d10: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65   cell.** data he
7d20: 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63  ader and the loc
7d30: 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20  al payload, but 
7d40: 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  not any overflow
7d50: 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20   page or.** the 
7d60: 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
7d70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  e cell pointer..
7d80: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
7d90: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
7da0: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
7db0: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
7dc0: 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65  r = &pCell[pPage
7dd0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b  ->childPtrSize];
7de0: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23  .  u32 nSize;..#
7df0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7e00: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
7e10: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
7e20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
7e30: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
7e40: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
7e50: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
7e60: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
7e70: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
7e80: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
7e90: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
7ea0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
7eb0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
7ec0: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
7ed0: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
7ee0: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
7ef0: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
7f00: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
7f10: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
7f20: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72 65  ebuginfo;.  btre
7f30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
7f40: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
7f50: 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  uginfo);.#endif.
7f60: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
7f70: 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20 2a  tKey ){.    u8 *
7f80: 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 50  pEnd;.    if( pP
7f90: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
7fa0: 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67        pIter += g
7fb0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
7fc0: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  , nSize);.    }e
7fd0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  lse{.      nSize
7fe0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
7ff0: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
8000: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
8010: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
8020: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
8030: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
8040: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
8050: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
8060: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
8070: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
8080: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
8090: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
80a0: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
80b0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
80c0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
80d0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
80e0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
80f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
8100: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
8110: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
8120: 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65 28    }..  testcase(
8130: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
8140: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8150: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8160: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8170: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70  );.  if( nSize>p
8180: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8190: 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  {.    int minLoc
81a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
81b0: 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20  ocal;.    nSize 
81c0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53  = minLocal + (nS
81d0: 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20  ize - minLocal) 
81e0: 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  % (pPage->pBt->u
81f0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
8200: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8210: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8220: 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
8230: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
8240: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
8250: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e  ;.    if( nSize>
8260: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8270: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
8280: 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d   minLocal;.    }
8290: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 3b  .    nSize += 4;
82a0: 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d 20  .  }.  nSize += 
82b0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
82c0: 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ell);..  /* The 
82d0: 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  minimum size of 
82e0: 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62 79  any cell is 4 by
82f0: 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 53  tes. */.  if( nS
8300: 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53 69  ize<4 ){.    nSi
8310: 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 61  ze = 4;.  }..  a
8320: 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65  ssert( nSize==de
8330: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  buginfo.nSize );
8340: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
8350: 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Size;.}..#ifdef 
8360: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
8370: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
8380: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
8390: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
83a0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
83b0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
83c0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
83d0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
83e0: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
83f0: 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c 53  {.  return cellS
8400: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66 69  izePtr(pPage, fi
8410: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
8420: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
8430: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8440: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
8450: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
8460: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
8470: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
8480: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
8490: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
84a0: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
84b0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
84c0: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
84d0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
84e0: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
84f0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
8500: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
8510: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
8520: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
8530: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
8540: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
8550: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
8560: 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65 50  l!=0 );.  btreeP
8570: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
8580: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
85a0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
85b0: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
85c0: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
85d0: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66  oad );.  if( inf
85e0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
85f0: 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
8600: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
8610: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
8620: 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
8630: 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c  Page->pBt, ovfl,
8640: 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
8650: 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  1, pPage->pgno, 
8660: 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  pRC);.  }.}.#end
8670: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
8680: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
8690: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
86a0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
86b0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
86c0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
86d0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
86e0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
86f0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
8700: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
8710: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
8720: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
8730: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
8740: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8750: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
8760: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
8770: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
8780: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
87b0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
87e0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
87f0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8810: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
8820: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
8830: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8840: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
8850: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
8860: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
8870: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8880: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
8890: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
88a0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
88c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
88d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
88e0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8900: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
8910: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
8920: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
8930: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8940: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8950: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
8960: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
8970: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
8980: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
8990: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
89a0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
89b0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
89c0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
89d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
89e0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
89f0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
8a00: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
8a10: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
8a20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
8a30: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
8a40: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
8a50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8a60: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
8a70: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
8a80: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
8a90: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
8aa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8ab0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8ac0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
8ad0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
8ae0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
8af0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
8b00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8b10: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
8b20: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
8b30: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
8b40: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
8b50: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
8b60: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
8b70: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
8b80: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8b90: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
8ba0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8bb0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
8bc0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
8bd0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
8be0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8bf0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
8c00: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
8c10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
8c20: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
8c30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
8c40: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
8c50: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
8c60: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
8c70: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
8c80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
8c90: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
8ca0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
8cb0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
8cc0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
8cd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
8ce0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
8cf0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
8d00: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
8d10: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
8d20: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
8d30: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
8d40: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
8d50: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
8d60: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8d70: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8d80: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
8d90: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
8da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8db0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
8dc0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
8dd0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
8de0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
8df0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
8e00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
8e10: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
8e20: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
8e30: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
8e40: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
8e50: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
8e60: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
8e70: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
8e80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
8e90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
8ea0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
8eb0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
8ec0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
8ed0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
8ee0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
8ef0: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
8f00: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
8f10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8f20: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
8f30: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
8f40: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
8f50: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
8f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8f70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8f80: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
8f90: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
8fa0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
8fb0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
8fc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8fd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8fe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
8ff0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9000: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9010: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9020: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9030: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9040: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9050: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9060: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9070: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9080: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
9090: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
90a0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
90b0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
90c0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
90d0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
90e0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
90f0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
9100: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9110: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
9120: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
9130: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
9140: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
9150: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
9160: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9170: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9180: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9190: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
91a0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
91b0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
91c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
91d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
91e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
91f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
9200: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
9210: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
9220: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
9230: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
9240: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
9250: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
9260: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
9270: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
9280: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
9290: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
92a0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
92b0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
92c0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
92d0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
92e0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
92f0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
9300: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
9310: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
9320: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
9330: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
9340: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
9350: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
9360: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
9370: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
9380: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
9390: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
93a0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
93b0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
93c0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
93d0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
93e0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
93f0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
9400: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
9410: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
9420: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
9430: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
9440: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
9450: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
9460: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
9470: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
9490: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
94a0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
94b0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
94c0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
94d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
94e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
94f0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
9500: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
9510: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
9520: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
9530: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
9540: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
9550: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Data */.  int nF
9560: 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  rag;            
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9580: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67  * Number of frag
9590: 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20  mented bytes on 
95a0: 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74  pPage */.  int t
95b0: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  op;             
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95d0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
95e0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
95f0: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  ea */.  int gap;
9600: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9610: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
9620: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
9630: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
9640: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ent */.  int rc;
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
9660: 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ger return code 
9670: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
9680: 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
9690: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ize of the page 
96a0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
96b0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
96c0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
96d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
96e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
96f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
9700: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9710: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
9720: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9730: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
9740: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
9750: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
9760: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
9770: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
9780: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
9790: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73  rflow==0 );.  us
97a0: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
97b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
97c0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  e;.  assert( nBy
97d0: 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d  te < usableSize-
97e0: 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  8 );..  nFrag = 
97f0: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 61  data[hdr+7];.  a
9800: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
9810: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
9820: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
9830: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
9840: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
9850: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
9860: 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32  ll;.  top = get2
9870: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
9880: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28  a[hdr+5]);.  if(
9890: 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75 72   gap>top ) retur
98a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
98b0: 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61 73  _BKPT;.  testcas
98c0: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
98d0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
98e0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
98f0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
9900: 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67 3e  );..  if( nFrag>
9910: 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c  =60 ){.    /* Al
9920: 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74 20  ways defragment 
9930: 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74 65  highly fragmente
9940: 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20 72  d pages */.    r
9950: 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
9960: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
9970: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
9980: 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  c;.    top = get
9990: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
99a0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 65  ta[hdr+5]);.  }e
99b0: 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  lse if( gap+2<=t
99c0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61  op ){.    /* Sea
99d0: 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  rch the freelist
99e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
99f0: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
9a00: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 0a  ugh to satisfy .
9a10: 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65      ** the reque
9a20: 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74 69  st. The allocati
9a30: 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d 20  on is made from 
9a40: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 73  the first free s
9a50: 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74  lot in .    ** t
9a60: 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20  he list that is 
9a70: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
9a80: 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a 20  accomadate it.. 
9a90: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 63     */.    int pc
9aa0: 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72 28  , addr;.    for(
9ab0: 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  addr=hdr+1; (pc 
9ac0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9ad0: 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64 72  [addr]))>0; addr
9ae0: 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =pc){.      int 
9af0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
9b00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
9b10: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
9b20: 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65     if( pc>usable
9b30: 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64 64  Size-4 || pc<add
9b40: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72  r+4 ){.        r
9b50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9b60: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9b70: 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20   }.      size = 
9b80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9b90: 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  c+2]);.      if(
9ba0: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
9bb0: 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
9bc0: 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20  size - nByte;.  
9bd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9be0: 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20  x==4 );.        
9bf0: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29  testcase( x==3 )
9c00: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
9c10: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
9c20: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
9c30: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
9c40: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
9c50: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
9c60: 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74       ** fragment
9c70: 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e 20  ed bytes within 
9c80: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
9c90: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64         memcpy(&d
9ca0: 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61  ata[addr], &data
9cb0: 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20  [pc], 2);.      
9cc0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
9cd0: 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78  = (u8)(nFrag + x
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
9cf0: 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75   if( size+pc > u
9d00: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
9d10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9d20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9d30: 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
9d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
9d50: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
9d60: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
9d70: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
9d80: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
9d90: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68         ** for th
9da0: 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62  e portion used b
9db0: 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  y the new alloca
9dc0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  tion. */.       
9dd0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
9de0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
9df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
9e00: 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20  pIdx = pc + x;. 
9e10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9e20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
9e30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9e40: 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
9e50: 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e 6f  ure there is eno
9e60: 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68 65  ugh space in the
9e70: 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79 0a   gap to satisfy.
9e80: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61 74    ** the allocat
9e90: 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64 65  ion.  If not, de
9ea0: 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  fragment..  */. 
9eb0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
9ec0: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
9ed0: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
9ee0: 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  >top ){.    rc =
9ef0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
9f00: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
9f10: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9f20: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
9f30: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
9f40: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
9f50: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
9f60: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
9f70: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
9f80: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
9f90: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
9fa0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
9fb0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
9fc0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
9fd0: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
9fe0: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
9ff0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
a000: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
a010: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
a020: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
a030: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
a040: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
a050: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
a060: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
a070: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
a080: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
a090: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
a0a0: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
a0b0: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
a0c0: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
a0d0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
a0e0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
a0f0: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
a100: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
a110: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a120: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
a130: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
a140: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
a150: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
a160: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
a170: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
a180: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
a190: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
a1a0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
a1b0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
a1c0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
a1d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
a1e0: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
a1f0: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
a200: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
a210: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
a220: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
a230: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
a240: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
a250: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
a260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a270: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
a280: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
a290: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
a2a0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
a2b0: 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69  in, hdr;.  int i
a2c0: 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  Last;           
a2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2e0: 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65  Largest possible
a2f0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
a300: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
a310: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
a320: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
a330: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
a340: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
a350: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a360: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a370: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a380: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
a390: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
a3a0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a3b0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a3c0: 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65 29 20   (start + size) 
a3d0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a3e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a3f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a400: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a410: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a420: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
a430: 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d  ize>=0 );   /* M
a440: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
a450: 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66 28 20   is 4 */..  if( 
a460: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 73 65 63 75  pPage->pBt->secu
a470: 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
a480: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
a490: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
a4a0: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
a4b0: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
a4c0: 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e  te.    ** option
a4d0: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
a4e0: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
a4f0: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
a500: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
a510: 74 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69  the space back i
a520: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
a530: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
a540: 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  s.  Note that.  
a550: 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  ** even though t
a560: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
a570: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
a580: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a590: 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74  ,.  ** btreeInit
a5a0: 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74 20 64  Page() did not d
a5b0: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70 69 6e  etect overlappin
a5c0: 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20  g cells or.  ** 
a5d0: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
a5e0: 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c 73  overlapped cells
a5f0: 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20  .   Nor does it 
a600: 64 65 74 65 63 74 20 77 68 65 6e 20 74 68 65 0a  detect when the.
a610: 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74 65 6e    ** cell conten
a620: 74 20 61 72 65 61 20 65 78 63 65 65 64 73 20 74  t area exceeds t
a630: 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
a640: 70 61 67 65 20 68 65 61 64 65 72 2e 20 20 49 66  page header.  If
a650: 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69 74 75   these.  ** situ
a660: 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20 74 68  ations arise, th
a670: 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  en subsequent in
a680: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
a690: 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a 20 20  might corrupt.  
a6a0: 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
a6b0: 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65 64 20    So we do need 
a6c0: 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 72  to check for cor
a6d0: 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20 73 63  ruption while sc
a6e0: 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  anning.  ** the 
a6f0: 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
a700: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
a710: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
a720: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c 61  = hdr + 1;.  iLa
a730: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
a740: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
a750: 0a 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74  .  assert( start
a760: 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77 68 69  <=iLast );.  whi
a770: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
a780: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a790: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
a7a0: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  egin>0 ){.    if
a7b0: 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b 34 20  ( pbegin<addr+4 
a7c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a7d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
a7e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
a7f0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
a800: 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e 3e 69  }.  if( pbegin>i
a810: 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  Last ){.    retu
a820: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
a830: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
a840: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
a850: 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29  r || pbegin==0 )
a860: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a870: 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29  ta[addr], start)
a880: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
a890: 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69  ta[start], pbegi
a8a0: 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  n);.  put2byte(&
a8b0: 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73  data[start+2], s
a8c0: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
a8d0: 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46  Free = pPage->nF
a8e0: 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b  ree + (u16)size;
a8f0: 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20  ..  /* Coalesce 
a900: 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c  adjacent free bl
a910: 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d  ocks */.  addr =
a920: 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c   hdr + 1;.  whil
a930: 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65 74  e( (pbegin = get
a940: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
a950: 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  ]))>0 ){.    int
a960: 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c 20 78   pnext, psize, x
a970: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a980: 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20 20  egin>addr );.   
a990: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 20   assert( pbegin 
a9a0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a9b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
a9c0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a9d0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a9e0: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a9f0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
aa00: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
aa10: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
aa20: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
aa30: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
aa40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
aa50: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
aa60: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
aa70: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
aa80: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
aa90: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
aab0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
aac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
aad0: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
aae0: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
aaf0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab00: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
ab10: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
ab20: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
ab30: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
ab40: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
ab50: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
ab60: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
ab70: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
ab80: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
ab90: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
aba0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
abb0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
abc0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
abd0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
abe0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
abf0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
ac00: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
ac10: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
ac20: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
ac30: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
ac40: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
ac50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
ac60: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
ac70: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
ac80: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
ac90: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
aca0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
acb0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
acc0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
acd0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ace0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
acf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
ad00: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
ad10: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
ad20: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
ad30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ad40: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ad50: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
ad60: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ad70: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
ad80: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
ad90: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
ada0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
adb0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
adc0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
add0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
ade0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
adf0: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
ae00: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
ae10: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
ae20: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
ae30: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
ae40: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
ae50: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
ae60: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
ae70: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
ae80: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
ae90: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
aea0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
aeb0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
aec0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
aed0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
aee0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aef0: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
af00: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
af10: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
af20: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
af30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
af40: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
af50: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
af60: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
af70: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
af80: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
af90: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
afa0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
afb0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
afc0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
afd0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
afe0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
aff0: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
b000: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
b010: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
b020: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b030: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
b040: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
b050: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
b060: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
b070: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
b080: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
b090: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
b0a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
b0b0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
b0c0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b0d0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
b0e0: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
b0f0: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
b100: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
b110: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
b120: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
b130: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
b140: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
b150: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
b160: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
b170: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
b180: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
b190: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b1a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
b1b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b1c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
b1d0: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
b1e0: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
b1f0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
b200: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
b210: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
b220: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
b230: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
b240: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
b250: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
b260: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
b270: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
b280: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
b290: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
b2a0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
b2b0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
b2c0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
b2d0: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
b2e0: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
b2f0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
b300: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
b310: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
b320: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
b330: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
b340: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
b350: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b360: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b370: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b380: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
b390: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
b3a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
b3b0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
b3c0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b3d0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b3e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
b3f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b400: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b410: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b420: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
b430: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
b440: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b450: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
b460: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
b470: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
b480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b490: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
b4a0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
b4b0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
b4c0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
b4d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b4e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
b4f0: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
b500: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
b510: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
b520: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
b530: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
b540: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
b550: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
b560: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74  cture */.    int
b570: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
b580: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
b590: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
b5a0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
b5b0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
b5c0: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
b5d0: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
b5e0: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
b5f0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
b600: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
b610: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
b620: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
b630: 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  age */.    int t
b640: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
b650: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
b660: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b670: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
b680: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
b690: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
b6a0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b6b0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
b6c0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
b6d0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
b6e0: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
b6f0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
b700: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
b710: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
b720: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
b730: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
b740: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b750: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
b760: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
b770: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
b780: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b790: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
b7a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
b7b0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
b7c0: 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20  ze<=65536 );.   
b7d0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
b7e0: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
b7f0: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20  geSize - 1);.   
b800: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
b810: 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c  w = 0;.    usabl
b820: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
b830: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61  bleSize;.    pPa
b840: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
b850: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
b860: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
b870: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20  ->leaf;.    top 
b880: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
b890: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
b8a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  .    pPage->nCel
b8b0: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
b8c0: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
b8d0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
b8e0: 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b  >MX_CELL(pBt) ){
b8f0: 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e  .      /* To man
b900: 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69  y cells for a si
b910: 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20  ngle page.  The 
b920: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
b930: 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  rupt */.      re
b940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b950: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b960: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50      testcase( pP
b970: 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
b980: 45 4c 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  ELL(pBt) );..   
b990: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
b9a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
b9b0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
b9c0: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
b9d0: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
b9e0: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
b9f0: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
ba00: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
ba10: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
ba20: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
ba30: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
ba40: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
ba50: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
ba60: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
ba70: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
ba80: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
ba90: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
baa0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
bab0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
bac0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
bad0: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
bae0: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
baf0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
bb00: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
bb10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
bb20: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
bb30: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
bb40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
bb50: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
bb60: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
bb70: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
bb80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
bb90: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
bba0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
bbb0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
bbc0: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
bbd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
bbe0: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
bbf0: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
bc00: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
bc10: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
bc20: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bc30: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
bc40: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
bc50: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
bc60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bc70: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bc80: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bc90: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bca0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bcb0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
bcc0: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
bcd0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
bce0: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
bcf0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
bd00: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
bd10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
bd20: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
bd40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
bd50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
bd60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bd70: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bd80: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
bd90: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
bda0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bdb0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
bdc0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
bdd0: 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  e */.    pc = ge
bde0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
bdf0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
be00: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
be10: 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  top;.    while( 
be20: 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31  pc>0 ){.      u1
be30: 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20  6 next, size;.  
be40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
be50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
be60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
be70: 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65   /* Start of fre
be80: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
be90: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
bea0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
beb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
bed0: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
bee0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bef0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
bf00: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
bf10: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
bf20: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
bf30: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
bf40: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
bf50: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
bf60: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
bf70: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
bf80: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
bf90: 65 20 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65  e of..** the fre
bfa0: 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65  e-block must lie
bfb0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
bfc0: 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
bfd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bfe0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
bff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46        }.      nF
c000: 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
c010: 7a 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e  ze;.      pc = n
c020: 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ext;.    }..    
c030: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
c040: 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
c050: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
c060: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
c070: 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  art.    ** of th
c080: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c090: 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
c0a0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c0b0: 73 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20  s within.    ** 
c0c0: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c0d0: 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69   area. If this i
c0e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
c0f0: 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20  he usable-size. 
c100: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67     ** of the pag
c110: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  e, then the page
c120: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
c130: 65 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61  ed. This check a
c140: 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65  lso.    ** serve
c150: 73 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  s to verify that
c160: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c170: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
c180: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20  cell-content.   
c190: 20 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64   ** area, accord
c1a0: 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20  ing to the page 
c1b0: 68 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74  header, lies wit
c1c0: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20  hin the page..  
c1d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72    */.    if( nFr
c1e0: 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ee>usableSize ){
c1f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c200: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c210: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  T; .    }.    pP
c220: 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31  age->nFree = (u1
c230: 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c  6)(nFree - iCell
c240: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67  First);.    pPag
c250: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
c260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c280: 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67  Set up a raw pag
c290: 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f  e so that it loo
c2a0: 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61  ks like a databa
c2b0: 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a  se page holding.
c2c0: 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a  ** no entries..*
c2d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65  /.static void ze
c2e0: 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  roPage(MemPage *
c2f0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73  pPage, int flags
c300: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
c310: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
c320: 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61  ->aData;.  BtSha
c330: 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
c340: 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20  ->pBt;.  u8 hdr 
c350: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
c360: 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b  et;.  u16 first;
c370: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
c380: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
c390: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
c3a0: 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  e)==pPage->pgno 
c3b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c3c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c3d0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
c3e0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
c3f0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
c400: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c410: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
c420: 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20  e) == data );.  
c430: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c440: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c450: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c460: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c470: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
c480: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
c490: 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
c4a0: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65  Delete ){.    me
c4b0: 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c  mset(&data[hdr],
c4c0: 20 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   0, pBt->usableS
c4d0: 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a  ize - hdr);.  }.
c4e0: 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63    data[hdr] = (c
c4f0: 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72  har)flags;.  fir
c500: 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34  st = hdr + 8 + 4
c510: 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41  *((flags&PTF_LEA
c520: 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d  F)==0 ?1:0);.  m
c530: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
c540: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
c550: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
c560: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
c570: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
c580: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
c590: 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28  ->nFree = (u16)(
c5a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c5b0: 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f  - first);.  deco
c5c0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
c5d0: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
c5e0: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
c5f0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
c600: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
c610: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c620: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
c630: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
c640: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
c650: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
c660: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
c670: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
c680: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
c690: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
c6a0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c6b0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
c6c0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
c6d0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
c6e0: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
c6f0: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
c700: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
c710: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
c720: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
c730: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
c740: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
c750: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
c760: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
c770: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
c780: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
c790: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
c7a0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c7b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
c7c0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
c7d0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
c7e0: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
c7f0: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
c800: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
c810: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
c820: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
c830: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
c840: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
c850: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
c860: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
c870: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
c880: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
c890: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
c8a0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
c8b0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
c8c0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
c8d0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
c8e0: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
c8f0: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
c900: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
c910: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
c920: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
c930: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
c940: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
c950: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
c960: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
c970: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
c980: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
c990: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
c9a0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
c9b0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
c9c0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
c9d0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
c9e0: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
c9f0: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
ca00: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
ca10: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
ca20: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
ca30: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
ca40: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
ca50: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
ca60: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
ca70: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
ca80: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
ca90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
caa0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
cab0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
cac0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
cad0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
cae0: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
caf0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ter */.  int noC
cb00: 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a  ontent        /*
cb10: 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67   Do not load pag
cb20: 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75  e content if tru
cb30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
cb40: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
cb50: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
cb60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
cb70: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
cb80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb90: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
cba0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
cbb0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
cbc0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
cbd0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cbe0: 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
cbf0: 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
cc00: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cc10: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
cc20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cc30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
cc40: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
cc50: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
cc60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
cc70: 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
cc80: 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
cc90: 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
cca0: 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
ccb0: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
ccc0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
ccd0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cce0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
ccf0: 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
cd00: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
cd10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
cd20: 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
cd30: 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
cd40: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
cd50: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
cd60: 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
cd70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
cd80: 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
cd90: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
cda0: 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
cdb0: 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
cdc0: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
cdd0: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
cde0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
cdf0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
ce00: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
ce10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
ce20: 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
ce30: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
ce40: 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
ce50: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
ce60: 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
ce70: 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
ce80: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
ce90: 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
cea0: 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
ceb0: 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
cec0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
ced0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
cee0: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
cef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
cf00: 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
cf10: 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a  x8000000)==0 );.
cf20: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74    return (int)bt
cf30: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
cf40: 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
cf50: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
cf60: 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
cf70: 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69  tialize it.  Thi
cf80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
cf90: 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e  t a.** convenien
cfa0: 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  ce wrapper aroun
cfb0: 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73  d separate calls
cfc0: 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
cfd0: 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65  () and .** btree
cfe0: 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
cff0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
d000: 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76  curs, then the v
d010: 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73 20  alue *ppPage is 
d020: 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69  set to is undefi
d030: 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
d040: 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
d050: 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
d060: 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
d070: 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
d080: 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
d090: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
d0a0: 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f  *pBt,          /
d0b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
d0c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
d0d0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
d0e0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
d0f0: 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
d100: 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
d110: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
d120: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
d130: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d140: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
d150: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d160: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
d170: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
d180: 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
d190: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
d1a0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d1b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
d1c0: 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
d1d0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
d1e0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
d1f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d200: 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
d210: 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
d220: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d240: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
d250: 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
d260: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d270: 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d   testcase( pgno=
d280: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d290: 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  pgno!=0 || rc==S
d2a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b  QLITE_CORRUPT );
d2b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d2c0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
d2d0: 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20   MemPage.  This 
d2e0: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
d2f0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70   once for each p
d300: 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  rior.** call to 
d310: 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  btreeGetPage..*/
d320: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
d330: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
d340: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
d350: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
d360: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
d370: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
d380: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d390: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d3a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d3b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d3c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d3d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d3e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d3f0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d400: 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
d410: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d420: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d430: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d440: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
d450: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
d460: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
d470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72    }.}../*.** Dur
d480: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
d490: 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72  when the pager r
d4a0: 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69  eloads informati
d4b0: 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  on into the cach
d4c0: 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65  e.** so that the
d4d0: 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
d4e0: 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
d4f0: 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20  al state at the 
d500: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d510: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72  transaction, for
d520: 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f   each page resto
d530: 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  red this routine
d540: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
d550: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e  * This routine n
d560: 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68  eeds to reset th
d570: 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63  e extra data sec
d580: 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20  tion at the end 
d590: 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  of the.** page t
d5a0: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
d5b0: 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a   restored data..
d5c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
d5d0: 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65  ageReinit(DbPage
d5e0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50   *pData){.  MemP
d5f0: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50  age *pPage;.  pP
d600: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a  age = (MemPage *
d610: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
d620: 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20  Extra(pData);.  
d630: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d640: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d650: 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69  (pData)>0 );.  i
d660: 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  f( pPage->isInit
d670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d680: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d690: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d6a0: 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61  utex) );.    pPa
d6b0: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
d6c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
d6d0: 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
d6e0: 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20  (pData)>1 ){.   
d6f0: 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68     /* pPage migh
d700: 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65  t not be a btree
d710: 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74   page;  it might
d720: 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
d730: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72  page.      ** or
d740: 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20   ptrmap page or 
d750: 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e  a free page.  In
d760: 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68   those cases, th
d770: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20  e following.    
d780: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72    ** call to btr
d790: 65 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c  eeInitPage() wil
d7a0: 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20  l likely return 
d7b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a  SQLITE_CORRUPT..
d7c0: 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20        ** But no 
d7d0: 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20  harm is done by 
d7e0: 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73  this.  And it is
d7f0: 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20   very important 
d800: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74  that.      ** bt
d810: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65  reeInitPage() be
d820: 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79   called on every
d830: 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77   btree page so w
d840: 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20  e make.      ** 
d850: 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65  the call for eve
d860: 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d  ry page that com
d870: 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69  es in for re-ini
d880: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62  ting. */.      b
d890: 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
d8a0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ge);.    }.  }.}
d8b0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
d8c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
d8d0: 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a  for a btree..*/.
d8e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d8f0: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
d900: 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  r(void *pArg){. 
d910: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
d920: 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67   (BtShared*)pArg
d930: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d940: 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >db );.  assert(
d950: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d960: 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74  eld(pBt->db->mut
d970: 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
d980: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
d990: 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64  yHandler(&pBt->d
d9a0: 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b  b->busyHandler);
d9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
d9c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
d9d0: 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65  ** .** zFilename
d9e0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
d9f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
da00: 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  e.  If zFilename
da10: 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e   is NULL.** then
da20: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61   an ephemeral da
da30: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
da40: 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61  d.  The ephemera
da50: 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  l database might
da60: 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65  .** be exclusive
da70: 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72  ly in memory, or
da80: 20 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20   it might use a 
da90: 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72  disk-based memor
daa0: 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68  y cache..** Eith
dab0: 65 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65  er way, the ephe
dac0: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77  meral database w
dad0: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
dae0: 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a  ally deleted .**
daf0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
db00: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
db10: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  led..**.** If zF
db20: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
db30: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e  ory:" then an in
db40: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
db50: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74   is created.** t
db60: 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63  hat is automatic
db70: 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77  ally destroyed w
db80: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
db90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61  ..**.** The "fla
dba0: 67 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  gs" parameter is
dbb0: 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20   a bitmask that 
dbc0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69  might contain bi
dbd0: 74 73 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ts.** BTREE_OMIT
dbe0: 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
dbf0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
dc00: 4b 2e 20 20 54 68 65 20 42 54 52 45 45 5f 4e 4f  K.  The BTREE_NO
dc10: 5f 52 45 41 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74  _READLOCK.** bit
dc20: 20 69 73 20 61 6c 73 6f 20 73 65 74 20 69 66 20   is also set if 
dc30: 74 68 65 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61  the SQLITE_NoRea
dc40: 64 6c 6f 63 6b 20 66 6c 61 67 73 20 69 73 20 73  dlock flags is s
dc50: 65 74 20 69 6e 20 64 62 2d 3e 66 6c 61 67 73 2e  et in db->flags.
dc60: 0a 2a 2a 20 54 68 65 73 65 20 66 6c 61 67 73 20  .** These flags 
dc70: 61 72 65 20 70 61 73 73 65 64 20 74 68 72 6f 75  are passed throu
dc80: 67 68 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 50  gh into sqlite3P
dc90: 61 67 65 72 4f 70 65 6e 28 29 20 61 6e 64 20 6d  agerOpen() and m
dca0: 75 73 74 0a 2a 2a 20 62 65 20 74 68 65 20 73 61  ust.** be the sa
dcb0: 6d 65 20 76 61 6c 75 65 73 20 61 73 20 50 41 47  me values as PAG
dcc0: 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  ER_OMIT_JOURNAL 
dcd0: 61 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  and PAGER_NO_REA
dce0: 44 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  DLOCK..**.** If 
dcf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
dd00: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
dd10: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
dd20: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
dd30: 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
dd40: 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
dd50: 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
dd60: 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
dd70: 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
dd80: 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
dd90: 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
dda0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
ddb0: 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
ddc0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
ddd0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
dde0: 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
ddf0: 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
de00: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
de10: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
de20: 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
de30: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
de40: 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
de50: 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
de60: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
de70: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
de80: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
de90: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
dea0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
deb0: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
dec0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ded0: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
dee0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
def0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
df00: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
df10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
df20: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
df30: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
df40: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
df50: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
df60: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
df70: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
df80: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
df90: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
dfa0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
dfb0: 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
dfc0: 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
dfd0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
dfe0: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
dff0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
e000: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
e010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
e020: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
e030: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
e040: 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
e050: 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
e060: 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
e070: 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
e080: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e090: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
e0a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
e0b0: 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
e0c0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
e0d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
e0e0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
e0f0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
e100: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
e110: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e120: 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
e130: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
e140: 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
e150: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
e160: 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
e170: 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
e180: 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
e190: 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
e1a0: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
e1b0: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
e1c0: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
e1d0: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
e1e0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
e1f0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e200: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
e210: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
e220: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
e230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e240: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
e250: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
e260: 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
e270: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
e280: 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
e290: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
e2a0: 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
e2b0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
e2c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
e2d0: 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
e2e0: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
e2f0: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  ));.#endif..  as
e300: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
e310: 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
e320: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e330: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e340: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
e350: 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
e360: 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
e370: 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
e380: 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
e390: 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
e3a0: 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
e3b0: 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
e3c0: 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
e3d0: 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
e3e0: 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
e3f0: 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
e400: 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
e410: 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
e420: 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
e430: 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
e440: 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
e450: 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
e460: 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
e470: 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
e480: 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
e490: 28 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ( db->flags & SQ
e4a0: 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20  LITE_NoReadlock 
e4b0: 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
e4c0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
e4d0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
e4e0: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e4f0: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e500: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e510: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e520: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
e530: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
e540: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
e550: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
e560: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
e570: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
e580: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e590: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
e5a0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e5b0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
e5c0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e5d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e5e0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
e5f0: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
e600: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
e610: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
e620: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e630: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
e640: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
e650: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
e660: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
e670: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e680: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e690: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e6a0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e6b0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
e6c0: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
e6d0: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
e6e0: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
e6f0: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
e700: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
e710: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
e720: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
e730: 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d  .  if( isMemdb==
e740: 30 20 26 26 20 69 73 54 65 6d 70 44 62 3d 3d 30  0 && isTempDb==0
e750: 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
e760: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e770: 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
e780: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  {.      int nFul
e790: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
e7a0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
e7b0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
e7c0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
e7d0: 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50  te3Malloc(nFullP
e7e0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
e7f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e800: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
e810: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
e820: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
e830: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e850: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e860: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e870: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
e880: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c     sqlite3OsFull
e890: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
e8a0: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
e8b0: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
e8c0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d  thname);.      m
e8d0: 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
e8e0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
e8f0: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
e900: 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
e910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e920: 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
e930: 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
e940: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
e950: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
e960: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
e970: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
e980: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
e990: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 66  Shared);.      f
e9a0: 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
e9b0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
e9c0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
e9d0: 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
e9e0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
e9f0: 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
ea00: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
ea10: 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
ea20: 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
ea30: 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
ea40: 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20  pBt->pPager)).  
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
ea60: 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56 66  & sqlite3PagerVf
ea70: 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  s(pBt->pPager)==
ea80: 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pVfs ){.        
ea90: 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20    int iDb;.     
eaa0: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d       for(iDb=db-
eab0: 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20  >nDb-1; iDb>=0; 
eac0: 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  iDb--){.        
ead0: 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69 73      Btree *pExis
eae0: 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69  ting = db->aDb[i
eaf0: 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20  Db].pBt;.       
eb00: 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74 69       if( pExisti
eb10: 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d  ng && pExisting-
eb20: 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20  >pBt==pBt ){.   
eb30: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eb40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
eb50: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
eb60: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
eb70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
eb80: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
eb90: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
eba0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
ebb0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ebd0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
ebe0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
ec00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ec10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ec20: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
ec30: 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52           pBt->nR
ec40: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
ec50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ec60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
ec70: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ec80: 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
ec90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
eca0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ecb0: 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  e);.    }.#ifdef
ecc0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
ecd0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a    else{.      /*
ece0: 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   In debug mode, 
ecf0: 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73  we mark all pers
ed00: 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65 73  istent databases
ed10: 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20   as sharable.   
ed20: 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20     ** even when 
ed30: 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54  they are not.  T
ed40: 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74 68  his exercises th
ed50: 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61  e locking code a
ed60: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65  nd.      ** give
ed70: 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69  s more opportuni
ed80: 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28 73  ty for asserts(s
ed90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
eda0: 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74  d()).      ** st
edb0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64  atements to find
edc0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d   locking problem
edd0: 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
ede0: 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
edf0: 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  1;.    }.#endif.
ee00: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
ee10: 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pBt==0 ){.    /
ee20: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c  *.    ** The fol
ee30: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d  lowing asserts m
ee40: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73 74  ake sure that st
ee50: 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62 79  ructures used by
ee60: 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a 20   the btree are. 
ee70: 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20     ** the right 
ee80: 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74  size.  This is t
ee90: 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  o guard against 
eea0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61  size changes tha
eeb0: 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  t result.    ** 
eec0: 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f  when compiling o
eed0: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 72  n a different ar
eee0: 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20  chitecture..    
eef0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
ef00: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c  izeof(i64)==8 ||
ef10: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20   sizeof(i64)==4 
ef20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ef30: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c  izeof(u64)==8 ||
ef40: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20   sizeof(u64)==4 
ef50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
ef60: 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
ef70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
ef80: 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
ef90: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
efa0: 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
efb0: 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
efc0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
efd0: 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
efe0: 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
eff0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f000: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
f010: 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
f020: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
f030: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
f040: 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e  pen(pVfs, &pBt->
f050: 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d  pPager, zFilenam
f060: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f070: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54               EXT
f080: 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20  RA_SIZE, flags, 
f090: 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65  vfsFlags, pageRe
f0a0: 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72  init);.    if( r
f0b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f0c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f0d0: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
f0e0: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
f0f0: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
f100: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
f110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
f120: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f130: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f140: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f150: 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
f160: 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
f170: 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
f180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
f190: 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
f1a0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
f1b0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
f1c0: 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
f1d0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
f1e0: 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
f1f0: 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
f200: 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
f210: 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
f220: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
f230: 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
f240: 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  er);.#ifdef SQLI
f250: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
f260: 0a 20 20 20 20 70 42 74 2d 3e 73 65 63 75 72 65  .    pBt->secure
f270: 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23 65 6e 64  Delete = 1;.#end
f280: 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  if.    pBt->page
f290: 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
f2a0: 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
f2b0: 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
f2c0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
f2d0: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
f2e0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
f2f0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f300: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
f310: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
f320: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
f330: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
f340: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
f350: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f360: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f370: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
f380: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
f390: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
f3a0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f3b0: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
f3c0: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
f3d0: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
f3e0: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
f3f0: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
f400: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
f410: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f420: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
f430: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
f440: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
f450: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
f460: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
f470: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
f480: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
f490: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
f4a0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
f4b0: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
f4c0: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
f4d0: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
f4e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f4f0: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
f500: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
f510: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f520: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f530: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
f540: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
f550: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f560: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
f570: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
f580: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
f590: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
f5a0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
f5b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
f5c0: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
f5d0: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
f5e0: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
f5f0: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
f600: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f610: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f620: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f630: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f640: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f650: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f660: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f670: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f680: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f690: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f6a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f6b0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f6c0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f6d0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f6e0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f6f0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f700: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f720: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f730: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f740: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f750: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f760: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f770: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f780: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f790: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f7a0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f7b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f7c0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f7d0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f7e0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f7f0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f800: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f810: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f820: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
f830: 6c 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  le ){.      sqli
f840: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
f850: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42  Shared;.      pB
f860: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
f870: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
f880: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f890: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f8a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f8b0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
f8c0: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
f8d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
f8e0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
f8f0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
f900: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
f910: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
f920: 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
f930: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
f940: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
f950: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f960: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
f970: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f980: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f990: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f9a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
f9b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
f9c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f9d0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
f9e0: 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
f9f0: 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
fa00: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
fa10: 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
fa20: 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
fa30: 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
fa40: 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
fa50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fa60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
fa70: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
fa80: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
fa90: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
faa0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
fab0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
fac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
fad0: 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
fae0: 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
faf0: 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
fb00: 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
fb10: 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
fb20: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
fb30: 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
fb40: 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
fb50: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
fb60: 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
fb70: 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
fb80: 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
fb90: 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
fba0: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
fbb0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fbc0: 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
fbd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
fbe0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
fbf0: 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
fc00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
fc10: 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
fc20: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
fc30: 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
fc40: 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
fc50: 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
fc60: 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
fc70: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
fc80: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
fc90: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
fca0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
fcb0: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
fcc0: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
fcd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
fce0: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
fcf0: 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
fd00: 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
fd10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
fd20: 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
fd30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fd40: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
fd50: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
fd60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
fd70: 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
fd80: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
fd90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
fda0: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
fdb0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
fdc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
fdd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
fde0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
fdf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
fe00: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
fe10: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
fe20: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
fe30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fe40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
fe50: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
fe60: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
fe70: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
fe80: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
fe90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
fea0: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
feb0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
fec0: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
fed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
fee0: 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
fef0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
ff00: 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
ff10: 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
ff20: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
ff30: 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
ff40: 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
ff50: 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
ff60: 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
ff70: 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
ff80: 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
ff90: 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
ffa0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
ffb0: 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
ffc0: 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
ffd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
ffe0: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
fff0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
10000 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
10010 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
10020 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
10030 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
10040 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10050 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
10060 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
10070 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
10080 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
10090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
100a0 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
100b0 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
100c0 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
100d0 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
100e0 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
100f0 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
10100 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
10110 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
10120 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
10130 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
10140 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
10150 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
10160 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
10170 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
10180 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
10190 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
101a0 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
101b0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
101c0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
101d0 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  HE.  sqlite3_mut
101e0 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 42  ex *pMaster;.  B
101f0 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a  tShared *pList;.
10200 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20    int removed = 
10210 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  0;..  assert( sq
10220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68  lite3_mutex_noth
10230 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
10240 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 73  );.  pMaster = s
10250 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
10260 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
10270 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
10280 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10290 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
102a0 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
102b0 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
102c0 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
102d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
102e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
102f0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
10300 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
10310 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10320 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
10330 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
10340 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
10350 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
10360 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
10370 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
10380 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
10390 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
103a0 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
103b0 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
103c0 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
103d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
103e0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
103f0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
10400 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
10410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10420 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
10430 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
10440 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10450 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
10460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
10470 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
10480 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10490 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
104a0 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
104b0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
104c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
104d0 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
104e0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
104f0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
10500 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
10510 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
10520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10530 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
10540 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10550 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
10560 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
10570 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10580 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
10590 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
105a0 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
105b0 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
105c0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
105d0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
105e0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
105f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
10600 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
10610 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
10620 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
10630 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
10640 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
10650 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
10660 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
10670 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
10680 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10690 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
106a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
106b0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
106c0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
106d0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
106e0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
106f0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
10700 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10710 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
10720 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
10730 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10740 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
10750 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
10760 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
10770 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
10780 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
10790 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
107a0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
107b0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
107c0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
107d0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
107e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
107f0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
10800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
10810 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
10820 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
10830 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
10840 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
10850 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
10860 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
10870 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
10880 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
10890 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
108a0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
108b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f  eeLeave(p);..  /
108c0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  * If there are s
108d0 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74  till other outst
108e0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
108f0 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  s to the shared-
10900 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63  btree.  ** struc
10910 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77  ture, return now
10920 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20  . The remainder 
10930 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  of this procedur
10940 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75  e cleans .  ** u
10950 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  p the shared-btr
10960 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ee..  */.  asser
10970 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
10980 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64  ==0 && p->locked
10990 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d  ==0 );.  if( !p-
109a0 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d  >sharable || rem
109b0 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
109c0 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f  st(pBt) ){.    /
109d0 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20  * The pBt is no 
109e0 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68  longer on the sh
109f0 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77  aring list, so w
10a00 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20  e can access.   
10a10 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68   ** it without h
10a20 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68  aving to hold th
10a30 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a  e mutex..    **.
10a40 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74      ** Clean out
10a50 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
10a60 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  BtShared object.
10a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10a80 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
10a90 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r );.    sqlite3
10aa0 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
10ab0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
10ac0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10ad0 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
10ae0 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
10af0 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
10b00 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
10b10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
10b20 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
10b30 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
10b40 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
10b50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
10b60 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
10b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
10b80 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
10b90 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10ba0 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
10bb0 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
10bc0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
10bd0 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
10be0 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
10bf0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
10c00 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
10c10 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
10c20 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
10c30 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
10c40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10c50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
10c60 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
10c70 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
10c80 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
10c90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
10ca0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
10cb0 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
10cc0 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
10cd0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
10ce0 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
10cf0 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
10d00 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
10d10 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
10d20 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
10d30 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
10d40 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
10d50 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
10d60 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
10d70 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
10d80 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
10d90 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
10da0 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
10db0 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
10dc0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
10dd0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
10de0 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
10df0 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
10e00 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
10e10 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
10e20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
10e30 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
10e40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
10e50 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
10e60 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
10e70 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
10e80 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
10e90 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
10ea0 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
10eb0 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
10ec0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
10ed0 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
10ee0 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
10ef0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
10f00 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
10f10 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
10f20 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
10f30 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
10f40 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10f50 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
10f60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10f70 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
10f80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10f90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
10fa0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
10fb0 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
10fc0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
10fd0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10fe0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11000 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
11010 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
11020 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
11030 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
11040 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
11050 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
11060 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
11070 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
11080 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
11090 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
110a0 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
110b0 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
110c0 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
110d0 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
110e0 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
110f0 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
11100 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
11110 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
11120 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
11130 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
11140 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11150 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
11160 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
11170 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
11180 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
11190 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
111a0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
111b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
111c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
111d0 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
111e0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
111f0 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42 74  afetyLevel(.  Bt
11200 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
11210 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
11220 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
11230 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
11240 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47           /* PRAG
11260 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20  MA synchronous. 
11270 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c   1=OFF, 2=NORMAL
11280 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69 6e  , 3=FULL */.  in
11290 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20  t fullSync,     
112a0 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
112b0 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20 69  ullfsync. */.  i
112c0 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20  nt ckptFullSync 
112d0 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
112e0 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66  checkpoint_fullf
112f0 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ync */.){.  BtSh
11300 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11310 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11330 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11340 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  ;.  assert( leve
11350 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
11360 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
11370 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
11380 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
11390 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50  etyLevel(pBt->pP
113a0 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c  ager, level, ful
113b0 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c 53  lSync, ckptFullS
113c0 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ync);.  sqlite3B
113d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
113e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
113f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
11400 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
11410 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
11420 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
11430 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
11440 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
11450 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
11460 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
11470 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
11480 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11490 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
114a0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
114b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
114c0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
114d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
114e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
114f0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
11500 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11510 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
11520 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
11530 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
11540 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
11550 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
11560 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11570 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11580 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11590 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
115a0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
115b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
115c0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
115d0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
115e0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
115f0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11600 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
11610 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
11620 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
11630 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
11640 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
11650 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
11660 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
11670 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
11680 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
11690 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
116a0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
116b0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
116c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
116d0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
116e0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
116f0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
11700 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
11710 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
11720 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
11730 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11740 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
11750 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
11760 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
11770 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
11780 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
11790 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
117a0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
117b0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
117c0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
117d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
117e0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
117f0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
11800 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
11810 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
11820 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
11830 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
11840 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
11850 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70  ix!=0 then the p
11860 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61  ageSizeFixed fla
11870 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
11880 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
11890 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
118a0 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
118b0 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
118c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
118d0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
118e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
118f0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
11900 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
11910 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11920 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
11930 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11940 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
11950 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
11960 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
11970 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
11980 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
11990 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20  geSizeFixed ){. 
119a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
119b0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
119c0 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
119d0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
119e0 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
119f0 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
11a00 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
11a10 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
11a20 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11a30 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
11a40 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
11a50 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
11a60 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
11a70 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
11a80 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
11a90 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
11aa0 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
11ab0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
11ac0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
11ad0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61  ssert( !pBt->pPa
11ae0 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75  ge1 && !pBt->pCu
11af0 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
11b00 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
11b10 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
11b20 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
11b30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
11b40 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11b50 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
11b60 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
11b70 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
11b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11b90 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
11ba0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
11bb0 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
11bc0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
11bd0 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 1;.  sqlite3B
11be0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11c10 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11c20 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11c40 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11c50 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11c60 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11c70 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
11c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11c90 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
11ca0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11cb0 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
11cc0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11cd0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
11ce0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
11cf0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
11d00 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
11d10 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
11d20 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
11d30 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
11d40 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
11d50 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
11d60 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
11d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11d80 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
11d90 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
11da0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11db0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
11dc0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
11dd0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
11de0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
11df0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
11e00 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
11e10 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
11e20 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
11e30 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
11e40 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
11e50 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
11e60 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
11e70 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
11e80 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
11e90 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
11ea0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
11eb0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
11ec0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
11ed0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
11ee0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
11ef0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
11f00 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
11f10 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11f20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
11f30 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
11f40 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
11f50 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
11f60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11f70 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
11f80 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 75  .** Set the secu
11f90 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69 66  reDelete flag if
11fa0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
11fb0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
11fc0 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
11fd0 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
11fe0 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
11ff0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
12000 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a 20  secureDelete.** 
12010 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
12020 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
12030 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
12040 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
12050 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
12060 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
12070 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
12080 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12090 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
120a0 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
120b0 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65    p->pBt->secure
120c0 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c 61  Delete = (newFla
120d0 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a 20  g!=0) ? 1 : 0;. 
120e0 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42 74   } .  b = p->pBt
120f0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b 0a  ->secureDelete;.
12100 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12110 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12120 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   b;.}.#endif /* 
12130 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12140 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
12150 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
12160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
12170 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  UM) */../*.** Ch
12180 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
12190 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
121a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
121b0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
121c0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
121d0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
121e0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
121f0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
12200 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
12210 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
12220 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
12230 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
12240 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
12250 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
12260 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
12270 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
12280 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
12290 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
122a0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
122b0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
122c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
122d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
122e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122f0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
12300 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
12310 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
12320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12330 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
12340 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
12350 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
12360 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
12370 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 28  geSizeFixed && (
12380 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61  av ?1:0)!=pBt->a
12390 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
123a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
123b0 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DONLY;.  }else{.
123c0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
123d0 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20  uum = av ?1:0;. 
123e0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
123f0 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b  um = av==2 ?1:0;
12400 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
12410 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
12420 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
12430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12440 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
12450 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20  e 'auto-vacuum' 
12460 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74  property. If aut
12470 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20  o-vacuum is .** 
12480 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74  enabled 1 is ret
12490 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
124a0 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
124b0 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61  e3BtreeGetAutoVa
124c0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
124d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
124e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
124f0 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54  return BTREE_AUT
12500 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65  OVACUUM_NONE;.#e
12510 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  lse.  int rc;.  
12520 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
12530 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20  r(p);.  rc = (. 
12540 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74     (!p->pBt->aut
12550 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  oVacuum)?BTREE_A
12560 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a  UTOVACUUM_NONE:.
12570 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e      (!p->pBt->in
12580 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  crVacuum)?BTREE_
12590 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a  AUTOVACUUM_FULL:
125a0 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56  .    BTREE_AUTOV
125b0 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a  ACUUM_INCR.  );.
125c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
125d0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
125e0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a   rc;.#endif.}...
125f0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
12600 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
12610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12620 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
12630 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
12640 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
12650 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
12660 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
12670 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
12680 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
12690 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
126a0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
126b0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
126c0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
126d0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
126e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
126f0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
12700 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
12710 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
12720 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
12730 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
12740 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
12750 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
12760 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
12770 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
12780 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12790 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
127a0 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
127b0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
127c0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
127d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
127e0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
127f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12800 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
12810 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
12820 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
12830 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
12840 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
12850 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
12860 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
12870 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
12880 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
12890 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
128a0 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
128b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
128c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
128d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
128e0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
128f0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
12900 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
12910 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
12920 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12930 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12940 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
12950 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
12960 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
12970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12980 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
12990 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
129a0 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
129b0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
129c0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
129d0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
129e0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
129f0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
12a00 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
12a10 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
12a20 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
12a30 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
12a40 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
12a50 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
12a60 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
12a70 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
12a80 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
12a90 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
12aa0 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
12ab0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
12ac0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  e;.  }.  if( nPa
12ad0 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20  ge>0 ){.    u32 
12ae0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75 33  pageSize;.    u3
12af0 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  2 usableSize;.  
12b00 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
12b10 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
12b20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
12b30 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
12b40 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
12b50 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
12b60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12b70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12b80 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
12b90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
12ba0 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
12bb0 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >1 ){.      pBt-
12bc0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
12bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
12be0 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[19]>1 ){.    
12bf0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12c00 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
12c10 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 61  #else.    if( pa
12c20 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20 20  ge1[18]>2 ){.   
12c30 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
12c40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
12c50 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
12c60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
12c70 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
12c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12c90 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
12ca0 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
12cb0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
12cc0 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
12cd0 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
12ce0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
12cf0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
12d00 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
12d10 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
12d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12d30 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
12d40 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
12d50 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
12d60 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
12d70 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
12d80 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
12d90 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
12da0 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
12db0 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
12dc0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
12dd0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
12de0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
12df0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
12e00 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
12e10 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
12e20 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
12e30 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
12e40 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
12e50 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
12e60 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55 73   && pBt->doNotUs
12e70 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eWAL==0 ){.     
12e80 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b   int isOpen = 0;
12e90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
12ea0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
12eb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73  pBt->pPager, &is
12ec0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  Open);.      if(
12ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ee0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
12ef0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12f00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12f10 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20  ( isOpen==0 ){. 
12f20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
12f30 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
12f40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12f50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
12f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12f70 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
12f80 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
12f90 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
12fa0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
12fb0 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
12fc0 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
12fd0 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
12fe0 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
12ff0 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
13000 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
13010 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
13020 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
13030 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
13040 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
13050 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
13060 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
13070 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
13080 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
13090 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
130a0 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
130b0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
130c0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
130d0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
130e0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
130f0 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
13100 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
13110 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
13120 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
13130 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
13140 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
13150 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
13160 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
13170 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
13180 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
13190 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
131a0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
131b0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
131c0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
131d0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
131e0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
131f0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
13200 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
13210 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
13220 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
13230 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
13240 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13250 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
13260 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
13270 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
13280 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
13290 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
132a0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
132b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
132c0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
132d0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
132e0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
132f0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
13300 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
13310 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
13320 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
13330 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
13340 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
13350 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
13360 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
13370 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
13380 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
13390 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
133a0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
133b0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
133c0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
133d0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
133e0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
133f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
13400 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13410 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
13420 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
13460 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
13470 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
13480 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
13490 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
134a0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
134b0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
134c0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
134d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
134e0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
134f0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13500 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
13510 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
13520 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
13530 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13540 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
13550 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
13560 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
13570 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13580 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
13590 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
135a0 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
135b0 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
135c0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
135d0 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
135e0 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
135f0 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
13600 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
13610 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
13620 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
13630 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
13640 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
13650 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
13660 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
13670 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
13680 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
13690 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
136a0 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
136b0 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
136c0 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
136d0 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
136e0 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
136f0 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
13700 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
13710 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
13720 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
13730 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
13740 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
13750 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
13760 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
13770 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
13780 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
13790 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
137a0 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
137b0 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
137c0 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
137d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
137e0 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
137f0 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
13800 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
13810 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
13820 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
13830 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
13840 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
13850 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
13860 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
13870 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
13880 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
13890 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
138a0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
138b0 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
138c0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
138d0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
138e0 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
138f0 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
13900 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
13910 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
13920 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
13930 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
13940 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
13950 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
13960 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
13970 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
13980 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
13990 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
139a0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
139b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139c0 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
139d0 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
139e0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
139f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
13a00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13a10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
13a20 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
13a30 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
13a40 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
13a50 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
13a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
13a70 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
13a80 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13a90 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
13aa0 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
13ab0 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
13ac0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
13ad0 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
13ae0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
13af0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
13b00 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
13b10 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
13b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
13b30 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
13b40 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13b60 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
13b70 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
13b80 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
13b90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13ba0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
13bb0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
13bc0 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42  pCursor==0 || pB
13bd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13be0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
13bf0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
13c00 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
13c10 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
13c20 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e1!=0 ){.    ass
13c30 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
13c40 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
13c50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
13c60 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
13c70 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
13c80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
13c90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
13ca0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
13cb0 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
13cc0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
13cd0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
13ce0 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
13cf0 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
13d00 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
13d10 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
13d20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
13d30 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
13d40 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
13d50 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
13d60 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
13d70 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
13d80 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
13d90 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
13da0 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
13db0 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
13dc0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
13dd0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13de0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13df0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
13e00 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
13e10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13e20 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
13e30 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
13e40 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
13e50 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
13e60 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
13e70 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
13e80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
13e90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13ea0 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
13eb0 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
13ec0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
13ed0 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
13ee0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
13ef0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
13f00 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
13f10 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
13f20 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
13f30 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
13f40 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
13f50 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
13f60 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
13f70 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
13f80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
13f90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
13fa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
13fb0 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
13fc0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
13fd0 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
13fe0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
13ff0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
14000 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
14010 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
14020 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
14030 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
14040 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
14050 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
14060 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
14070 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
14080 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
14090 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
140a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
140b0 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
140c0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
140d0 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
140e0 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
140f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14100 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
14110 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
14120 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
14130 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
14140 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14150 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
14160 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
14170 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
14180 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e  .#endif.  pBt->n
14190 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61  Page = 1;.  data
141a0 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  [31] = 1;.  retu
141b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
141c0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
141d0 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
141e0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
141f0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
14200 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
14210 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14220 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
14230 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
14240 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
14250 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
14260 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
14270 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
14280 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
14290 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
142a0 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
142b0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
142c0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
142d0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
142e0 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
142f0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
14300 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
14310 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
14320 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
14330 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
14340 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
14350 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
14360 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
14370 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
14380 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
14390 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
143a0 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
143b0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
143c0 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
143d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
143e0 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
143f0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
14400 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
14410 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
14420 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
14430 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
14440 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
14450 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
14460 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
14470 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
14480 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14490 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
144a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
144b0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
144c0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
144d0 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
144e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
144f0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
14500 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
14510 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
14520 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
14530 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
14540 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
14550 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
14560 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
14570 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
14580 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
14590 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
145a0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
145b0 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
145c0 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
145d0 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
145e0 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
145f0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
14600 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
14610 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
14620 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
14630 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
14640 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
14650 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
14660 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
14670 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
14680 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
14690 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
146a0 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
146b0 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
146c0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
146d0 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
146e0 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
146f0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
14700 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
14710 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
14720 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
14730 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
14740 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
14750 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
14760 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
14770 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
14780 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
14790 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
147a0 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
147b0 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
147c0 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
147d0 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
147e0 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
147f0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
14800 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
14810 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
14820 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
14830 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
14840 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
14850 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
14860 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
14870 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
14880 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c  t wrflag){.  sql
14890 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30  ite3 *pBlock = 0
148a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
148b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
148c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
148d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
148e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
148f0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14900 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
14910 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
14920 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
14930 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
14940 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
14950 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
14960 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
14970 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
14980 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
14990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
149a0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
149b0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
149c0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
149d0 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
149e0 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
149f0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
14a00 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
14a10 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
14a20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
14a30 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
14a40 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
14a50 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
14a60 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
14a70 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
14a80 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
14a90 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
14aa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14ab0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
14ac0 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
14ad0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14ae0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
14af0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
14b00 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20  action .  ** on 
14b10 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
14b20 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
14b30 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
14b40 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
14b50 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
14b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
14b70 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ED..  */.  if( (
14b80 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
14b90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14ba0 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42  ANS_WRITE) || pB
14bb0 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a  t->isPending ){.
14bc0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
14bd0 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
14be0 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
14bf0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
14c00 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
14c10 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
14c20 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
14c30 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
14c40 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
14c50 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
14c60 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
14c70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
14c80 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14ca0 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
14cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
14cc0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
14cd0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
14ce0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14cf0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
14d00 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
14d10 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
14d20 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
14d30 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
14d40 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
14d50 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
14d60 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
14d70 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
14d80 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
14d90 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
14da0 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
14db0 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
14dc0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
14dd0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
14de0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
14df0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
14e00 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
14e10 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
14e20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
14e30 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
14e40 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14e50 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c  ..  pBt->initial
14e60 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70  lyEmpty = (u8)(p
14e70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20  Bt->nPage==0);. 
14e80 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
14e90 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
14ea0 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
14eb0 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
14ec0 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
14ed0 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
14ee0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
14ef0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
14f00 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
14f10 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
14f20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
14f30 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
14f40 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
14f50 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
14f60 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
14f70 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
14f80 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
14f90 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
14fa0 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
14fb0 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
14fc0 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
14fd0 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
14fe0 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
14ff0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
15000 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
15010 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
15020 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
15030 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
15040 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
15050 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
15060 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
15070 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
15080 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
15090 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
150a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
150b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
150c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
150d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
150e0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
150f0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
15100 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
15110 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
15120 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15140 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
15150 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
15160 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15170 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
15180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15190 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
151a0 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
151b0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
151c0 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
151d0 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
151e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
151f0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
15200 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
15210 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
15220 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
15230 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15240 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15250 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
15260 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
15270 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
15280 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
15290 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
152a0 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
152b0 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e   ){..assert( p->
152c0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
152d0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
152e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
152f0 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
15300 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
15310 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
15320 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
15330 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
15340 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
15350 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
15360 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
15370 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
15380 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
15390 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
153a0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
153b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
153c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
153d0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
153e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
153f0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
15400 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15410 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
15420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15430 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15440 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
15450 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
15460 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
15470 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
15480 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20  Bt->isExclusive 
15490 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29  = (u8)(wrflag>1)
154a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
154b0 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a  /* If the db-siz
154c0 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69  e header field i
154d0 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20  s incorrect (as 
154e0 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20  it may be if an 
154f0 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69  old.      ** cli
15500 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69  ent has been wri
15510 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
15520 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20  e file), update 
15530 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20  it now. Doing.  
15540 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e      ** this soon
15550 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c  er rather than l
15560 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64  ater means the d
15570 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e  atabase size can
15580 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a   safely .      *
15590 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61  * re-read the da
155a0 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d  tabase size from
155b0 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76   page 1 if a sav
155c0 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61  epoint or transa
155d0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72  ction.      ** r
155e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77  ollback occurs w
155f0 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ithin the transa
15600 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
15610 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
15620 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26  Page!=get4byte(&
15630 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
15640 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ]) ){.        rc
15650 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15660 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
15670 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
15680 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
156a0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
156b0 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
156c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  nPage);.        
156d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
156e0 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
156f0 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
15700 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
15710 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
15720 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20  call makes sure 
15730 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68  that the pager h
15740 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  as the correct n
15750 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20  umber of.    ** 
15760 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
15770 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
15780 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
15790 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
157a0 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
157b0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
157c0 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
157d0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
157e0 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  d here..    */. 
157f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15800 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
15810 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
15820 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
15830 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
15840 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
15850 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15860 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15870 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15880 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
15890 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  UUM../*.** Set t
158a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
158b0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
158c0 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20  hildren of page 
158d0 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a  pPage. Also, if.
158e0 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ** pPage contain
158f0 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69  s cells that poi
15900 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
15910 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f  ages, set the po
15920 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
15930 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65  ries for the ove
15940 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77  rflow pages as w
15950 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
15960 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  nt setChildPtrma
15970 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ps(MemPage *pPag
15980 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e           /* Coun
159b0 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  ter variable */.
159c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
159f0 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20  f cells in page 
15a00 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72  pPage */.  int r
15a10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a30 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
15a40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
15a50 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
15a60 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  u8 isInitOrig = 
15a70 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
15a80 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
15a90 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
15aa0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15ab0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
15ac0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
15ad0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
15ae0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  ge(pPage);.  if(
15af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15b00 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63  {.    goto set_c
15b10 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
15b20 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20  ;.  }.  nCell = 
15b30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
15b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
15b50 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
15b60 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
15b70 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
15b80 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
15b90 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
15ba0 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
15bb0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
15bc0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
15bd0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
15be0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
15bf0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
15c00 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
15c10 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
15c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15c30 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
15c40 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
15c50 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15c60 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
15c70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
15c80 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
15c90 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
15ca0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
15cb0 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
15cc0 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
15cd0 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
15ce0 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
15cf0 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
15d00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
15d10 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
15d20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
15d30 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
15d40 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
15d50 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
15d60 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
15d70 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
15d80 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
15d90 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
15da0 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
15db0 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
15dc0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
15dd0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
15de0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
15df0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
15e00 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15e20 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
15e30 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
15e40 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
15e50 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
15e60 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
15e70 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
15e80 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
15e90 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
15ea0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
15eb0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
15ec0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
15ed0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
15ee0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
15ef0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
15f00 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
15f10 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
15f20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
15f30 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
15f40 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
15f50 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
15f60 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
15f70 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
15f80 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
15f90 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
15fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15fb0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
15fc0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
15fd0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
15fe0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
15ff0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
16000 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
16010 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
16020 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
16030 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
16040 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
16050 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
16060 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
16070 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
16080 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
16090 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
160a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
160b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
160c0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
160d0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
160e0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
160f0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
16100 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
16110 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
16120 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69  l;..    btreeIni
16130 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
16140 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
16150 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
16160 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
16170 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
16180 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
16190 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
161a0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
161b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
161c0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
161d0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62   info;.        b
161e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
161f0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
16200 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  info);.        i
16210 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
16220 77 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  w.         && pC
16230 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell+info.iOverfl
16240 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61  ow+3<=pPage->aDa
16250 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
16260 67 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ge.         && i
16270 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
16280 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
16290 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29  flow]).        )
162a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
162b0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
162c0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
162d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
162e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
162f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16300 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
16310 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
16320 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
16330 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
16340 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16350 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16360 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16370 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
16380 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
16390 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
163a0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
163b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
163c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
163d0 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
163e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
163f0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16400 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
16410 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
16420 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
16430 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
16440 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
16450 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
16460 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
16470 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16480 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
16490 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
164a0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
164b0 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
164c0 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
164d0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
164e0 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
164f0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
16500 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
16510 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
16520 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
16530 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
16540 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
16550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
16560 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
16570 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
16580 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
16590 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
165a0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
165b0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
165c0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
165d0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
165e0 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
165f0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
16600 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
16610 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
16620 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
16630 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
16640 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
16650 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
16660 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
16670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
16680 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
16690 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
166a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
166b0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
166c0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
166d0 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
166e0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
166f0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
16700 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16710 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
16720 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
16730 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
16740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
16750 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
16760 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
16770 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
16780 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
16790 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
167a0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
167b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
167c0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
167d0 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
167e0 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
167f0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
16800 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
16810 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
16820 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
16830 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
16840 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
16850 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
16860 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
16870 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
16880 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
16890 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
168a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
168b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
168c0 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
168d0 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
168e0 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
168f0 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
16900 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
16910 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
16920 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
16930 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
16940 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
16950 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
16960 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
16970 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
16980 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
16990 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
169a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
169b0 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
169c0 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
169d0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
169e0 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
169f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16a00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16a10 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
16a20 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
16a30 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
16a40 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
16a50 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
16a60 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
16a70 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
16a80 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
16a90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
16aa0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
16ab0 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
16ac0 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
16ad0 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
16ae0 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
16af0 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
16b00 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
16b10 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
16b20 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
16b30 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
16b40 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
16b50 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
16b60 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
16b70 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
16b80 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
16b90 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
16ba0 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
16bb0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
16bc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
16bd0 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
16be0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
16bf0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
16c00 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
16c10 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
16c20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16c40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
16c60 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
16c70 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
16c80 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
16c90 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
16ca0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
16cb0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
16cc0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
16cd0 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
16ce0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16cf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16d10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16d20 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
16d30 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
16d40 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
16d50 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
16d60 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
16d70 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
16d80 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
16d90 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
16da0 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
16db0 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
16dc0 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
16dd0 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
16de0 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
16df0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
16e00 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
16e10 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
16e20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16e30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
16e40 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
16e50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
16e60 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
16e70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
16e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16e90 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16ea0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
16eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16ec0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
16ed0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
16ee0 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
16ef0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
16f00 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
16f10 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
16f20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16f40 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
16f50 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
16f60 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
16f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16f80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
16f90 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
16fa0 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
16fb0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
16fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
16fd0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
16fe0 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
16ff0 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
17000 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
17010 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
17020 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
17030 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
17040 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
17050 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
17060 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
17070 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
17080 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
17090 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
170a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
170b0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
170c0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
170d0 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
170e0 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
170f0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
17100 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
17110 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
17120 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
17130 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
17140 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
17150 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
17160 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
17170 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
17180 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17190 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
171a0 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
171b0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
171c0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
171d0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
171e0 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
171f0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
17200 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
17210 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
17220 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
17230 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
17240 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
17250 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
17260 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
17270 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69  lete.  If nFin i
17280 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  s zero, it is as
17290 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e  sumed that.** in
172a0 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 77  crVacuumStep() w
172b0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20  ill be called a 
172c0 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66  finite amount of
172d0 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20   times.** which 
172e0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65  may or may not e
172f0 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69 73  mpty the freelis
17300 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76  t.  A full autov
17310 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69  acuum.** has nFi
17320 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20  n>0.  A "PRAGMA 
17330 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
17340 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e  um" has nFin==0.
17350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
17360 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
17370 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
17380 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
17390 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
173a0 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
173b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
173c0 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
173d0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
173e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
173f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17400 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
17410 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17420 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
17430 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
17440 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
17450 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
17460 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17470 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
17480 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
17490 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
174a0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
174b0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
174c0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
174d0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
174e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
17500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
17510 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
17520 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
17530 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
17540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17560 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17570 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17580 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
175a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
175b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
175c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
175d0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
175e0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
175f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
17600 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
17610 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
17620 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
17630 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
17640 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
17650 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
17660 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
17670 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
17680 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
17690 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
176a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
176b0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
176c0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
176d0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
176e0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
176f0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
17700 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
17710 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
17720 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
17730 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
17740 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
17750 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
17760 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
17770 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
17780 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17790 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
177a0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
177b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
177c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
177d0 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
177e0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
177f0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
17800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
17810 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
17820 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
17830 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17840 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
17850 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
17860 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
17870 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
17880 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17890 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
178a0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
178b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
178c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
178d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
178e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
178f0 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
17900 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
17910 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
17920 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
17930 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
17940 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
17950 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
17960 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
17970 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
17980 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
17990 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
179a0 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
179b0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
179c0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
179d0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
179e0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
179f0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
17a00 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
17a10 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
17a20 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
17a30 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
17a40 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
17a50 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
17a60 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
17a70 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
17a80 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
17a90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
17ac0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
17ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
17ae0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17af0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17b00 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
17b10 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
17b20 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
17b30 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
17b40 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
17b50 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
17b60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17b70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
17b80 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
17b90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17bb0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
17bc0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
17bd0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
17be0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
17bf0 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
17c00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17c10 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
17c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17c40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
17c60 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
17c70 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
17c80 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
17c90 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
17ca0 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
17cb0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
17cc0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Pg) ){.      if(
17cd0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
17ce0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
17cf0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
17d00 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  *pPg;.        rc
17d10 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
17d20 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
17d30 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 0);.        
17d40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17d50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17d60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17d70 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
17d80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
17d90 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
17da0 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
17db0 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
17dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17de0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17e00 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
17e10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
17e20 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
17e30 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
17e40 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  , iLastPg);.    
17e50 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
17e60 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
17e70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17e80 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
17e90 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
17ea0 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
17eb0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
17ec0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
17ed0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
17ee0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
17ef0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
17f00 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
17f10 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
17f20 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
17f30 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
17f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
17f50 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
17f60 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
17f70 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
17f80 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
17f90 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
17fa0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
17fb0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
17fc0 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
17fd0 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
17fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
17ff0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
18000 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
18010 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18020 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
18030 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18040 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18050 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18060 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
18070 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18080 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
18090 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
180a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
180b0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
180c0 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
180d0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
180e0 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
180f0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
18100 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65 63  t, 0, btreePagec
18110 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20 20  ount(pBt));.    
18120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18130 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18140 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18150 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
18160 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
18170 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18180 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
18190 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
181a0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
181b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
181c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
181d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
181e0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
181f0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
18200 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
18210 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
18220 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
18230 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
18240 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
18250 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18260 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
18270 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
18280 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18290 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
182a0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
182b0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
182c0 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
182d0 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
182e0 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
182f0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
18300 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
18310 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
18320 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
18330 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
18340 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
18350 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
18360 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
18370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18380 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
18390 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
183a0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
183b0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
183c0 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
183d0 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
183e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
183f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
18400 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
18410 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
18420 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
18430 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
18440 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
18450 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
18460 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
18470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
18480 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
18490 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
184a0 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
184b0 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
184c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
184d0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
184e0 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
184f0 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
18500 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18510 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
18520 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
18530 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
18540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
18550 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
18560 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ed */.    int nE
18570 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  ntry;        /* 
18580 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
18590 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
185a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
185b0 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
185c0 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
185d0 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
185e0 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
185f0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
18600 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
18610 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
18620 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
18630 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18640 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
18650 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
18660 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
18670 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
18680 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
18690 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
186a0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
186b0 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
186c0 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
186d0 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
186e0 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
186f0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
18700 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
18710 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
18720 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18730 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18740 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
18750 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18760 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
18770 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74      nEntry = pBt
18780 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
18790 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
187a0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
187b0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
187c0 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
187d0 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  try;.    nFin = 
187e0 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
187f0 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28  nPtrmap;.    if(
18800 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
18810 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
18820 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
18830 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18840 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
18850 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50    }.    while( P
18860 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
18870 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
18880 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18890 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
188a0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
188b0 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
188c0 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
188d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
188e0 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
188f0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
18900 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18910 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
18920 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
18930 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
18940 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  , iFree);.    }.
18950 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
18960 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
18970 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
18980 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
18990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
189a0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
189b0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
189c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
189d0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
189e0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
189f0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18a00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
18a10 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
18a20 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
18a30 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
18a40 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
18a50 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
18a60 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
18a70 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
18a80 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
18a90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18ac0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
18ad0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
18ae0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
18af0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
18b00 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
18b10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18b20 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
18b30 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18b40 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
18b50 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
18b60 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
18b70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
18b80 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
18b90 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
18ba0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
18bb0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
18bc0 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
18bd0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18be0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
18bf0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
18c00 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
18c10 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
18c20 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
18c30 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
18c40 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
18c50 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
18c60 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
18c70 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
18c80 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
18c90 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
18ca0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
18cb0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
18cc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
18cd0 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
18ce0 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
18cf0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
18d00 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
18d10 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
18d20 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
18d30 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
18d40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
18d50 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
18d60 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
18d70 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
18d80 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
18d90 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
18da0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
18db0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
18dc0 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
18dd0 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
18de0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18df0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
18e00 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
18e10 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18e20 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
18e30 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
18e40 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
18e50 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
18e60 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
18e70 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
18e80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
18e90 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
18ea0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
18eb0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
18ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
18ed0 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
18ee0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
18ef0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
18f00 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
18f10 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
18f20 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
18f30 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
18f40 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
18f50 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
18f60 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
18f70 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18f80 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
18f90 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
18fa0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
18fb0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
18fc0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18fd0 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
18fe0 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
18ff0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
19000 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
19010 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
19020 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
19030 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
19040 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
19050 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
19060 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
19070 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
19080 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
19090 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
190a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
190b0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
190c0 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
190d0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
190e0 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
190f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
19100 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
19110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19120 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19130 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
19140 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
19150 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
19160 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19170 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
19180 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19190 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
191a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
191b0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
191c0 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
191d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
191e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
191f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19200 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
19210 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19220 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
19230 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
19240 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19250 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
19260 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
19270 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19280 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
19290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
192a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
192b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
192c0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
192d0 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
192e0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
192f0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
19300 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
19310 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
19320 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
19330 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
19340 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
19350 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19360 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19370 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
19380 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c  p) );..  btreeCl
19390 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
193a0 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t);.  if( p->inT
193b0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
193c0 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65  && p->db->active
193d0 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
193e0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
193f0 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
19400 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
19410 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
19420 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
19430 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
19440 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
19450 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
19460 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
19470 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
19480 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
19490 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
194a0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
194b0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
194c0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
194d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
194e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
194f0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
19500 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
19510 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
19520 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
19530 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
19540 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
19550 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
19560 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
19570 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
19580 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
19590 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
195a0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
195b0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
195c0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
195d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
195e0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
195f0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
19600 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
19610 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
19620 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
19630 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
19640 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
19650 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
19660 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
19670 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
19680 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
19690 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
196a0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
196b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
196c0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
196d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
196e0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
196f0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
19700 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
19710 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
19720 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
19730 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
19740 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
19750 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
19760 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
19770 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19780 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
19790 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
197a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
197b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
197c0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
197d0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
197e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
197f0 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
19800 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
19810 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
19820 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
19830 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
19840 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
19850 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
19860 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
19870 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
19880 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
19890 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
198a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
198b0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
198c0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
198d0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
198e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
198f0 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
19900 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
19910 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
19920 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
19930 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
19940 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
19950 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
19960 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
19970 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
19980 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
19990 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
199a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
199b0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
199c0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
199d0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
199e0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
199f0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
19a00 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19a10 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
19a20 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
19a30 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
19a40 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
19a50 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
19a60 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
19a70 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
19a80 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
19a90 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
19aa0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
19ab0 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
19ac0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
19ad0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
19ae0 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
19af0 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
19b00 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
19b10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
19b20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
19b30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
19b40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
19b50 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
19b60 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
19b70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
19b80 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
19b90 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
19ba0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
19bb0 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
19bc0 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
19bd0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
19be0 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
19bf0 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
19c00 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
19c10 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
19c20 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
19c30 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19c40 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
19c50 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
19c60 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
19c70 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
19c80 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
19c90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
19ca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
19cb0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
19cc0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
19cd0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
19ce0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
19cf0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
19d00 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
19d10 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
19d20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19d30 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19d40 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
19d50 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
19d60 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
19d70 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
19d80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19da0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
19db0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
19dc0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
19dd0 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
19de0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
19df0 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
19e00 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
19e10 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
19e20 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
19e30 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
19e40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
19e50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19e60 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
19e70 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
19e80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19e90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
19ea0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
19eb0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
19ec0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
19ed0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
19ee0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19ef0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
19f00 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
19f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19f20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
19f30 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
19f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19f50 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
19f60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19f70 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
19f80 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
19f90 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
19fa0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
19fb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19fc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19fd0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19fe0 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
19ff0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1a000 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a010 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1a020 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1a030 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a040 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1a050 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a060 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1a070 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1a080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a090 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1a0a0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1a0b0 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1a0c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a0d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a0e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a0f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a100 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
1a110 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
1a120 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
1a130 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1a140 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1a150 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1a160 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1a170 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1a180 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1a190 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
1a1a0 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
1a1b0 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75  tine, a write-cu
1a1c0 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1a1d0 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1a1e0 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67  pable of writing
1a1f0 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
1a200 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65    That means the
1a210 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f   cursor was.** o
1a220 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
1a230 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64   for writing and
1a240 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
1a250 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a  not be disabled.
1a260 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73  ** by having its
1a270 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74   state changed t
1a280 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a  o CURSOR_FAULT..
1a290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a2a0 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
1a2b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a2c0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1a2d0 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1a2e0 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1a2f0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1a300 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1a310 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
1a320 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65  rFlag && pCur->e
1a330 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1a340 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1a350 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1a360 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1a370 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1a380 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
1a390 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
1a3a0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
1a3b0 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
1a3c0 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
1a3d0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1a3e0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1a3f0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1a400 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
1a410 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1a420 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
1a430 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1a440 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1a450 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1a460 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
1a470 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1a480 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1a490 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1a4a0 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1a4b0 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
1a4c0 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
1a4d0 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
1a4e0 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
1a4f0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
1a500 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
1a510 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
1a520 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
1a530 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
1a540 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
1a550 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
1a560 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
1a570 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
1a580 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
1a590 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
1a5a0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
1a5b0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1a5c0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1a5d0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1a5e0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1a5f0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
1a600 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
1a610 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1a620 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a630 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1a640 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1a650 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1a660 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1a670 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
1a680 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1a690 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  sor(p);.    p->e
1a6a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
1a6b0 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
1a6c0 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1a6d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a6e0 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
1a6f0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1a700 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
1a710 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
1a720 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
1a730 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1a740 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1a750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1a760 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1a770 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
1a780 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
1a790 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
1a7a0 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
1a7b0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
1a7c0 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
1a7d0 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
1a7e0 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
1a7f0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
1a800 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
1a810 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
1a820 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1a830 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1a840 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1a850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a860 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1a870 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1a880 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1a890 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1a8a0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1a8b0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1a8c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1a8d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1a8e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a8f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1a900 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1a910 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1a920 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1a930 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
1a940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a950 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
1a960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a970 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1a980 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
1a990 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
1a9a0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1a9b0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
1a9c0 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
1a9d0 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
1a9e0 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
1a9f0 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
1aa00 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
1aa10 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
1aa20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
1aa30 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1aa40 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
1aa50 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
1aa60 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
1aa70 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
1aa80 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
1aa90 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
1aaa0 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
1aab0 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
1aac0 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
1aad0 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
1aae0 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
1aaf0 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
1ab00 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
1ab10 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
1ab20 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
1ab30 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
1ab40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
1ab50 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
1ab60 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
1ab70 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1ab80 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
1ab90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1aba0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1abb0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
1abc0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
1abd0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1abe0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
1abf0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1ac00 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
1ac10 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
1ac20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ac30 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1ac40 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
1ac50 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1ac60 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
1ac70 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
1ac80 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
1ac90 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
1aca0 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
1acb0 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
1acc0 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
1acd0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
1ace0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
1acf0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1ad00 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
1ad10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ad20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
1ad30 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1ad40 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1ad50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ad60 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
1ad70 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1ad80 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
1ad90 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1ada0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1adb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1adc0 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
1add0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
1ade0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1adf0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ae00 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
1ae10 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
1ae20 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
1ae30 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1ae40 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1ae50 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1ae60 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1ae70 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1ae80 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1ae90 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1aea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
1aeb0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
1aec0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1aed0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
1aee0 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
1aef0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
1af00 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
1af10 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
1af20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
1af30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1af40 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
1af50 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
1af60 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1af70 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
1af80 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
1af90 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
1afa0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
1afb0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
1afc0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
1afd0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
1afe0 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
1aff0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
1b000 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
1b010 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
1b020 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
1b030 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
1b040 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
1b050 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
1b060 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
1b070 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
1b080 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
1b090 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
1b0a0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
1b0b0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
1b0c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
1b0d0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
1b0e0 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
1b0f0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
1b100 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
1b110 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
1b120 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
1b130 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
1b140 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
1b150 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
1b160 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
1b170 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
1b180 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
1b190 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b1a0 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
1b1b0 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
1b1c0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1b1d0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
1b1e0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
1b1f0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
1b200 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
1b210 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
1b220 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
1b230 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
1b240 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
1b250 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
1b260 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
1b270 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
1b280 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1b290 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1b2a0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
1b2b0 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
1b2c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1b2d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1b2e0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
1b2f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1b300 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1b310 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1b320 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b330 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
1b340 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1b350 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1b360 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1b370 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1b380 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1b390 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b3a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b3b0 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1b3c0 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1b3d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b3e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1b3f0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1b400 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1b410 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1b420 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1b430 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1b440 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1b450 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1b460 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1b470 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1b480 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1b490 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1b4a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b4b0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1b4c0 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1b4d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1b4e0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1b4f0 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1b500 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1b510 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b530 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1b540 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1b550 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1b560 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1b570 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1b580 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1b590 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1b5a0 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1b5b0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1b5c0 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1b5d0 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1b5e0 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1b5f0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1b600 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1b610 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1b620 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1b630 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1b640 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1b650 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1b660 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1b670 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1b680 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1b690 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1b6a0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1b6b0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1b6c0 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1b6d0 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1b6e0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1b6f0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1b700 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1b710 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1b720 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1b730 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1b740 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1b750 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1b760 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b770 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1b780 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1b790 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1b7a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1b7b0 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1b7c0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b7d0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1b7e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1b7f0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1b800 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1b810 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1b820 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1b830 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b840 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1b850 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1b860 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1b870 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1b880 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1b890 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1b8a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1b8b0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1b8c0 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1b8d0 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1b8e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b8f0 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1b900 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e  int<0 && pBt->in
1b910 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70  itiallyEmpty ) p
1b920 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1b930 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1b940 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1b950 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1b960 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1b970 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1b980 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1b990 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1b9a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1b9b0 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1b9c0 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1b9d0 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1b9e0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1b9f0 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1ba00 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1ba10 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1ba20 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1ba30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ba40 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1ba50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ba60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ba70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ba80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1ba90 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1baa0 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1bab0 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1bac0 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1bad0 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1bae0 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1baf0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1bb00 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1bb10 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1bb20 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1bb30 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1bb40 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1bb50 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1bb60 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1bb70 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1bb80 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1bb90 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1bba0 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1bbb0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1bbc0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1bbd0 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1bbe0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1bbf0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1bc00 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1bc10 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1bc20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1bc30 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1bc40 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1bc50 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1bc60 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1bc70 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1bc80 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1bc90 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1bca0 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1bcb0 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1bcc0 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1bcd0 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1bce0 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1bcf0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1bd00 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1bd10 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1bd20 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1bd30 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1bd40 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1bd50 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1bd60 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1bd70 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1bd80 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1bd90 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1bda0 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1bdb0 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1bdc0 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1bdd0 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1bde0 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1bdf0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1be00 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1be10 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1be20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1be30 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1be40 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1be50 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1be60 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1be70 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1be80 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1be90 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1bea0 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1beb0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1bec0 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1bed0 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1bee0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1bef0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1bf00 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1bf10 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1bf20 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1bf30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1bf40 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1bf50 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1bf60 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1bf70 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1bf80 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1bf90 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1bfa0 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1bfb0 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1bfc0 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1bfd0 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1bfe0 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1bff0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1c000 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1c010 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c040 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1c050 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1c080 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1c090 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1c0a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0c0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1c0d0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1c0e0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1c0f0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1c100 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c110 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1c120 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1c130 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1c160 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1c170 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1c180 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1c190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c1a0 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1c1b0 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1c1c0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1c1d0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1c1e0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1c1f0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1c200 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1c210 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1c220 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1c230 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1c240 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1c250 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1c260 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1c270 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1c280 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1c290 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1c2a0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1c2b0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1c2c0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1c2d0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1c2e0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1c2f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c300 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1c310 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1c320 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1c330 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1c340 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1c350 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1c360 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1c370 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1c380 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1c390 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1c3a0 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1c3b0 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1c3c0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1c3d0 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1c3e0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1c3f0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1c400 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1c410 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1c420 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1c430 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1c440 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1c450 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   && pBt->readOnl
1c460 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
1c470 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1c490 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1c4a0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1c4b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1c4c0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1c4d0 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1c4e0 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1c4f0 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1c500 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1c510 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1c520 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1c530 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1c540 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1c550 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1c560 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1c570 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1c580 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1c590 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1c5a0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1c5b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1c5c0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1c5d0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1c5e0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1c5f0 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1c600 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1c610 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1c620 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1c630 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1c640 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1c650 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1c660 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1c670 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1c680 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1c690 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1c6a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1c6b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1c6c0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1c6d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c700 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1c710 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c740 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1c750 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1c760 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c790 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1c7a0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1c7b0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1c7c0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1c7d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1c7e0 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1c7f0 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1c800 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c820 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1c830 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1c840 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1c850 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1c860 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1c870 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1c880 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1c890 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1c8a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1c8b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1c8c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1c8d0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1c8e0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1c8f0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1c900 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1c910 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1c920 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1c930 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1c940 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1c950 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1c960 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1c970 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1c980 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1c990 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1c9a0 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1c9b0 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1c9c0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1c9d0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1c9e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1c9f0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1ca00 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1ca10 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1ca20 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1ca30 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1ca40 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1ca50 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1ca60 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1ca70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1ca80 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1ca90 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1caa0 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1cab0 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1cac0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1cad0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1cae0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1caf0 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1cb00 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1cb10 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1cb20 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1cb30 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1cb40 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1cb50 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1cb60 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1cb70 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1cb80 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1cb90 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1cba0 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1cbb0 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1cbc0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1cbd0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1cbe0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1cbf0 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1cc00 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1cc10 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1cc20 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1cc30 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1cc40 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1cc50 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1cc60 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1cc70 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1cc80 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1cc90 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1cca0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1ccb0 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1ccc0 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1ccd0 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1cce0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1ccf0 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1cd00 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1cd10 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1cd20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1cd30 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1cd40 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1cd50 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1cd60 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1cd70 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1cd80 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1cd90 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1cda0 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1cdb0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1cdc0 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1cdd0 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1cde0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1cdf0 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1ce00 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1ce10 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1ce20 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1ce30 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1ce40 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1ce50 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1ce60 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1ce70 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1ce80 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1ce90 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1cea0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1ceb0 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1cec0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1ced0 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1cee0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1cef0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1cf00 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1cf10 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1cf20 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1cf30 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1cf40 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1cf50 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1cf60 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1cf70 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1cf80 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1cf90 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1cfa0 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1cfb0 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1cfc0 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1cfd0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1cfe0 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1cff0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1d000 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1d010 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1d020 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1d030 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1d040 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1d050 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1d060 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1d070 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1d080 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d090 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1d0a0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1d0b0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1d0c0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1d0d0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1d0e0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1d0f0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1d100 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1d110 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1d120 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1d130 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1d140 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1d150 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1d160 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1d170 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1d180 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1d190 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1d1a0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1d1b0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1d1c0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1d1d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d1e0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d1f0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1d200 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1d210 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1d220 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d230 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1d240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d250 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1d260 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1d270 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1d280 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1d290 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1d2a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d2b0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1d2c0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1d2d0 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1d2e0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1d2f0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1d300 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1d310 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d330 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1d340 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1d350 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1d360 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1d370 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1d380 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1d390 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d3a0 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1d3b0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1d3c0 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1d3d0 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1d3e0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1d3f0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d400 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1d410 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1d420 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1d430 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d440 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1d450 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1d460 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1d470 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1d480 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1d490 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1d4a0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1d4b0 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1d4c0 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1d4d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d4e0 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1d4f0 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1d500 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1d510 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1d520 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1d530 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1d540 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1d550 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1d560 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1d570 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1d580 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1d590 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1d5a0 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1d5b0 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1d5c0 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1d5d0 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1d5e0 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1d5f0 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1d600 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1d610 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1d620 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d630 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1d640 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1d650 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1d660 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1d670 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1d680 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1d690 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1d6a0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1d6b0 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1d6c0 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1d6d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
1d6e0 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1d6f0 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1d700 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1d710 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1d720 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1d730 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1d740 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1d750 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1d760 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1d770 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1d780 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1d790 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1d7a0 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1d7b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1d7c0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1d7d0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1d7e0 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1d7f0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1d800 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1d810 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1d820 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1d830 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1d840 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1d850 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d860 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1d870 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1d880 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1d890 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1d8a0 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1d8b0 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1d8c0 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1d8d0 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1d8e0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1d8f0 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1d900 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1d910 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1d920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1d950 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1d960 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1d9a0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1d9b0 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1d9f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1da00 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1da10 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1da20 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1da30 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1da40 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1da90 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dad0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1dae0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1daf0 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1db30 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1db40 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1db50 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1db60 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1db70 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1db80 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1db90 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1dba0 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1dbb0 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1dbc0 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1dbd0 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1dbe0 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1dbf0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1dc00 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1dc10 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1dc20 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1dc30 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1dc40 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1dc50 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1dc60 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1dc70 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1dc80 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1dc90 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1dca0 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1dcb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1dcc0 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1dcd0 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1dce0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1dcf0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1dd00 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1dd10 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1dd20 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1dd30 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1dd40 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1dd50 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1dd60 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1dd70 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1dd80 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1dd90 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1dda0 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1ddb0 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1ddc0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1ddd0 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1dde0 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1ddf0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1de00 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1de10 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1de20 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1de30 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1de40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1de50 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1de60 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1de70 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1de80 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1de90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1dea0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1deb0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1dec0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1ded0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1dee0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1def0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1df00 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1df10 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1df20 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1df30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1df40 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1df50 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1df60 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1df70 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1df80 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1df90 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1dfa0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1dfb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1dfc0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1dfd0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1dfe0 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1dff0 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1e000 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1e010 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1e020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e030 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1e040 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1e050 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1e060 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1e070 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1e080 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1e090 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1e0a0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1e0b0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1e0c0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1e0d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e0e0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1e0f0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1e100 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1e110 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1e120 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1e130 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1e140 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1e150 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1e160 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1e170 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1e180 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1e190 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1e1a0 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1e1b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e1c0 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1e1d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e1e0 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1e1f0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e200 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e210 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1e220 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e230 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1e240 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1e250 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1e260 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1e270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e280 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1e290 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1e2a0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1e2b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e2c0 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1e2d0 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1e2e0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1e2f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e300 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e310 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1e320 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1e330 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1e340 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1e350 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1e360 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1e370 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1e380 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1e390 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1e3a0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1e3b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1e3c0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e3d0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1e3e0 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1e3f0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1e400 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1e410 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e420 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1e430 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1e440 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1e450 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1e460 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1e470 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1e480 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1e490 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1e4a0 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1e4b0 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1e4c0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1e4d0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1e4e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e4f0 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1e500 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1e510 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1e520 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1e530 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1e540 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1e550 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1e560 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1e570 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1e580 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1e590 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1e5a0 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1e5b0 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1e5c0 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1e5d0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1e5e0 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1e5f0 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1e600 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1e610 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1e620 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1e630 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1e640 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1e650 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e670 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1e680 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1e690 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1e6a0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1e6b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1e6c0 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1e6d0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1e6e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1e6f0 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1e700 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1e710 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e730 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1e740 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1e750 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1e760 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1e770 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1e780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e790 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1e7a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e7b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1e7c0 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1e7d0 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1e7e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e7f0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1e800 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1e810 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1e820 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1e830 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1e840 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1e850 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1e860 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1e870 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1e880 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1e890 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1e8a0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1e8b0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1e8c0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1e8d0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1e8e0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1e8f0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1e900 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1e910 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1e920 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1e930 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1e940 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1e950 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1e960 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1e970 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1e980 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1e990 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1e9a0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1e9b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1e9c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1e9d0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1e9e0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1e9f0 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1ea00 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1ea10 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1ea20 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1ea30 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1ea40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ea50 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1ea60 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1ea70 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1ea80 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1ea90 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1eaa0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1eab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eac0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1ead0 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1eae0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1eaf0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1eb00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1eb10 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1eb20 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1eb30 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1eb40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1eb50 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1eb60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1eb70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1eb80 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1eb90 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1eba0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1ebb0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1ebc0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1ebd0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1ebe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1ebf0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1ec00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1ec10 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1ec20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1ec30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1ec40 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1ec50 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1ec60 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1ec70 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1ec80 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1ec90 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1eca0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1ecb0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1ecc0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1ecd0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1ece0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1ecf0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1ed00 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1ed10 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1ed20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1ed30 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1ed40 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1ed50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1ed60 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1ed70 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1ed80 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1ed90 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1eda0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1edb0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1edc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1edd0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1ede0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1edf0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1ee00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1ee10 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1ee20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1ee30 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1ee40 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1ee50 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1ee60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ee70 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1ee80 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1eeb0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1eec0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1eed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1eee0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1eef0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1ef00 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1ef10 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1ef20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1ef30 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1ef40 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1ef50 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1ef60 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1ef70 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1ef80 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1ef90 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1efa0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
1efb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1efc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1efd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1efe0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1eff0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
1f000 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
1f010 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
1f020 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
1f030 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
1f040 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1f050 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
1f060 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
1f070 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f080 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f090 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f0a0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1f0b0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
1f0c0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1f0d0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
1f0e0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
1f0f0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1f100 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
1f110 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
1f120 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
1f130 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
1f140 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
1f150 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1f160 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
1f170 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
1f180 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
1f190 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
1f1a0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1f1b0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
1f1c0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1f1d0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
1f1e0 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
1f1f0 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
1f200 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1f210 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
1f220 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
1f230 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
1f240 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1f250 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
1f260 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1f270 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1f280 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
1f290 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
1f2a0 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
1f2b0 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
1f2c0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
1f2d0 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
1f2e0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
1f2f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1f300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1f310 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
1f320 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
1f330 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
1f340 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f350 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
1f360 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
1f370 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
1f380 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
1f390 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
1f3a0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
1f3b0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
1f3c0 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
1f3d0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
1f3e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f3f0 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1f400 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1f410 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
1f420 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
1f430 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
1f440 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
1f450 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
1f460 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
1f470 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
1f480 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
1f490 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
1f4a0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
1f4b0 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
1f4c0 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
1f4d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f4e0 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
1f4f0 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
1f500 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
1f510 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
1f520 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
1f530 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
1f540 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
1f550 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
1f560 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
1f570 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
1f580 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
1f590 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f5a0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f5b0 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f5c0 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f5d0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
1f5e0 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
1f5f0 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
1f600 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
1f610 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
1f620 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
1f630 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
1f640 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
1f650 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
1f660 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
1f670 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
1f680 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
1f690 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1f6a0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1f6b0 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1f6c0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1f6d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1f6e0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1f6f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1f700 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1f710 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1f720 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1f730 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f740 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1f750 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1f760 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1f770 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1f780 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1f790 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1f7a0 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1f7b0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1f7c0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1f7d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f7e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f7f0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1f800 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1f810 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1f820 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1f830 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f840 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1f850 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1f860 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1f870 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1f880 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1f890 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1f8a0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1f8b0 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1f8c0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1f8d0 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
1f8e0 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
1f8f0 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
1f900 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
1f910 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1f920 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
1f930 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
1f940 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
1f950 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
1f960 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
1f970 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
1f980 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1f990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f9a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f9b0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1f9c0 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
1f9d0 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
1f9e0 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
1f9f0 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
1fa00 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
1fa10 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1fa20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1fa30 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
1fa40 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
1fa50 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
1fa60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1fa70 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
1fa80 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
1fa90 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1faa0 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1fab0 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
1fac0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
1fad0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
1fae0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
1faf0 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
1fb00 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
1fb10 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1fb20 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1fb30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1fb40 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
1fb50 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
1fb60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1fb70 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
1fb80 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
1fb90 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
1fba0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
1fbb0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1fbc0 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
1fbd0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
1fbe0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fbf0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1fc00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
1fc10 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1fc20 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
1fc30 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
1fc40 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
1fc50 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1fc60 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
1fc70 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
1fc80 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
1fc90 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
1fca0 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
1fcb0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1fcc0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
1fcd0 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
1fce0 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
1fcf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
1fd00 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
1fd10 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
1fd20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
1fd30 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
1fd40 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
1fd50 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
1fd60 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
1fd70 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
1fd80 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
1fd90 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
1fda0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
1fdb0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1fdc0 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
1fdd0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
1fde0 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
1fdf0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
1fe00 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
1fe10 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
1fe20 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
1fe30 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
1fe40 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
1fe50 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
1fe60 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
1fe70 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
1fe80 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
1fe90 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
1fea0 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
1feb0 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
1fec0 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
1fed0 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
1fee0 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
1fef0 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1ff00 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
1ff10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1ff20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ff30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
1ff40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1ff50 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1ff60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1ff70 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
1ff80 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
1ff90 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
1ffa0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
1ffb0 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
1ffc0 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
1ffd0 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1ffe0 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1fff0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
20000 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
20010 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
20020 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
20030 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
20040 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
20050 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
20060 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
20070 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
20080 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
20090 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
200a0 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
200b0 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
200c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
200d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
200e0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
200f0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
20100 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20110 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
20120 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
20130 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
20140 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
20150 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20160 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
20170 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
20180 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
20190 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
201a0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
201b0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
201c0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
201d0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
201e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
201f0 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
20200 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
20210 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
20220 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
20230 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
20240 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
20250 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
20260 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20270 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
20280 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
20290 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
202a0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
202b0 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
202c0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
202d0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
202e0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
202f0 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
20300 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
20310 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
20320 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
20330 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
20340 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20350 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
20360 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
20370 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20380 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20390 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
203a0 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
203b0 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
203c0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
203d0 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
203e0 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
203f0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
20400 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
20410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20420 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
20430 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
20440 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
20450 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
20460 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
20470 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
20480 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
20490 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
204a0 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
204b0 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
204c0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
204d0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
204e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
204f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
20500 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
20510 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
20520 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
20530 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20540 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
20550 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20560 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
20570 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
20580 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
20590 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
205a0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
205b0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
205c0 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
205d0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
205e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
205f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
20600 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
20610 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
20620 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
20630 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
20640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20650 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
20660 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
20670 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
20680 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
20690 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
206a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
206b0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
206c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
206d0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
206e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
206f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
20700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20710 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
20720 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
20730 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
20740 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
20750 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
20760 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
20770 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
20780 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
20790 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
207a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
207b0 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
207c0 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
207d0 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
207e0 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
207f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
20800 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
20810 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
20820 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
20830 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
20840 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
20850 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
20860 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
20870 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
20880 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
20890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
208a0 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
208b0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
208c0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
208d0 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
208e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
208f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20900 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20910 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20920 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20930 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
20940 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
20950 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
20960 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20970 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20980 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
20990 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
209a0 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
209b0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
209c0 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
209d0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
209e0 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
209f0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
20a00 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
20a10 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
20a20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
20a30 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
20a40 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
20a50 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
20a60 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
20a70 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
20a80 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
20a90 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
20aa0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
20ab0 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
20ac0 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
20ad0 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
20ae0 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
20af0 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
20b00 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
20b10 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
20b20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20b30 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
20b40 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
20b50 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
20b60 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
20b70 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
20b80 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
20b90 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
20ba0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
20bb0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
20bc0 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
20bd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20be0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20bf0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20c00 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
20c10 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
20c20 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
20c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20c40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20c50 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20c60 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
20c70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
20c80 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
20c90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
20ca0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
20cb0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20cc0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
20cd0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
20ce0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
20cf0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
20d00 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
20d10 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
20d20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20d30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20d40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
20d50 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
20d60 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
20d70 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
20d80 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
20d90 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
20da0 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
20db0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
20dc0 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
20dd0 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
20de0 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
20df0 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
20e00 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
20e10 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
20e20 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
20e30 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
20e40 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
20e50 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
20e60 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
20e70 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
20e80 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
20e90 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
20ea0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
20eb0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
20ec0 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
20ed0 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
20ee0 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
20ef0 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
20f00 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
20f10 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
20f20 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
20f30 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
20f40 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
20f50 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
20f60 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
20f70 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
20f80 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
20f90 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
20fa0 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
20fb0 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
20fc0 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
20fd0 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
20fe0 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
20ff0 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
21000 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
21010 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
21020 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
21030 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
21040 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
21050 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
21060 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
21070 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
21080 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21090 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
210a0 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
210b0 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
210c0 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
210d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
210e0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
210f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
21100 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
21110 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
21120 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
21130 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
21140 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
21150 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
21160 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
21170 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
21180 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
21190 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
211a0 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
211b0 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
211c0 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
211d0 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
211e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
211f0 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
21200 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
21210 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
21220 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
21230 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
21240 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
21250 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21260 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
21270 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21280 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21290 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
212a0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
212b0 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
212c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
212d0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
212e0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
212f0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
21300 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  e->nCell );.  if
21310 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e  ( NEVER(pCur->in
21320 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a  fo.nSize==0) ){.
21330 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
21340 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
21350 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43  pCur->iPage], pC
21360 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21370 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
21380 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72             &pCur
21390 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61  ->info);.  }.  a
213a0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
213b0 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
213c0 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
213d0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
213e0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
213f0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
21400 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
21410 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72  nKey = (int)pCur
21420 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
21430 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
21440 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b  {.    aPayload +
21450 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63  = nKey;.    nLoc
21460 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
21470 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20  nLocal - nKey;. 
21480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63   }else{.    nLoc
21490 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
214a0 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65  nLocal;.    asse
214b0 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79  rt( nLocal<=nKey
214c0 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20   );.  }.  *pAmt 
214d0 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
214e0 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
214f0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
21500 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
21510 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
21520 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
21530 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
21540 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
21550 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
21560 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
21570 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
21580 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
21590 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
215a0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
215b0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
215c0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
215d0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
215e0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
215f0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
21600 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
21610 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
21620 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
21630 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
21640 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
21650 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
21660 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
21670 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
21680 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
21690 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
216a0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
216b0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
216c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
216d0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
216e0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
216f0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
21700 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
21710 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
21720 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
21730 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
21740 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
21750 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
21760 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
21770 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21780 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
21790 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
217a0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
217b0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
217c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
217d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
217e0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
217f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21800 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
21810 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
21820 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
21830 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
21840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
21850 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
21860 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
21870 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
21880 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
21890 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
218a0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
218b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
218c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
218d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
218e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
218f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21900 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
21910 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21920 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
21930 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
21940 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
21950 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
21960 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
21970 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
21980 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
21990 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
219a0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
219b0 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
219c0 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
219d0 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
219e0 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
219f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21a00 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
21a10 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
21a20 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
21a30 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
21a40 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
21a50 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
21a60 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
21a70 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
21a80 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
21a90 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
21aa0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
21ab0 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
21ac0 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
21ad0 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
21ae0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
21af0 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
21b00 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
21b10 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
21b20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
21b30 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
21b40 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
21b50 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
21b60 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
21b70 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21b80 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21b90 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21ba0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21bb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21bc0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
21bd0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
21be0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
21bf0 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
21c00 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
21c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21c20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21c30 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
21c40 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
21c50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
21c60 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
21c70 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
21c80 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
21c90 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
21ca0 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
21cb0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
21cc0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
21cd0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
21ce0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
21cf0 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
21d00 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50  nCell<1 || pNewP
21d10 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  age->intKey!=pCu
21d20 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e  r->apPage[i]->in
21d30 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
21d40 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21d50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
21d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21d70 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
21d80 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
21d90 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
21da0 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
21db0 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
21dc0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
21dd0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
21de0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
21df0 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
21e00 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
21e10 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
21e20 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
21e30 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
21e40 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
21e50 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
21e60 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
21e70 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
21e80 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
21e90 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
21ea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21eb0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
21ec0 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
21ed0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
21ee0 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
21ef0 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
21f00 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
21f10 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
21f20 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
21f30 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
21f40 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
21f50 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
21f60 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
21f70 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
21f80 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
21f90 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
21fa0 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
21fb0 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
21fc0 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
21fd0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
21fe0 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
21ff0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
22000 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
22010 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
22020 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
22030 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
22040 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
22050 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
22060 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
22070 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
22080 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
22090 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
220a0 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
220b0 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
220c0 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
220d0 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
220e0 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
220f0 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
22100 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
22110 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
22120 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
22130 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22140 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
22150 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22160 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22170 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22180 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
22190 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
221a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
221b0 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
221c0 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
221d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
221e0 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
221f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22200 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
22210 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22220 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
22230 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
22240 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
22250 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
22260 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
22270 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22280 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
22290 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
222a0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
222b0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
222c0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
222d0 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
222e0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
222f0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
22300 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
22310 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
22320 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
22330 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
22340 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
22350 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
22360 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
22370 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
22380 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
22390 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
223a0 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
223b0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
223c0 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
223d0 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
223e0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
223f0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
22400 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
22410 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
22420 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
22430 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
22440 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
22450 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
22460 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
22470 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
22480 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
22490 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
224a0 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
224b0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
224c0 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
224d0 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
224e0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
224f0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
22500 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
22510 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22520 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
22530 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
22540 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
22550 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
22560 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
22570 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
22580 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
22590 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
225a0 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
225b0 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
225c0 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
225d0 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
225e0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
225f0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
22600 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
22610 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
22620 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
22630 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
22640 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
22650 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
22660 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
22670 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
22680 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
22690 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
226a0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
226b0 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
226c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
226d0 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
226e0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
226f0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
22700 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22710 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
22720 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
22730 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22740 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
22750 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22760 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22770 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
22780 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
22790 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
227a0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
227b0 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
227c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
227d0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
227e0 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
227f0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
22800 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
22810 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
22820 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
22830 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22840 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
22850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22860 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
22870 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
22880 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
22890 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
228a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
228b0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
228c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
228d0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
228e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
228f0 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
22900 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
22910 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22920 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
22930 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
22940 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
22950 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
22960 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
22970 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
22980 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
22990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
229a0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
229b0 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
229c0 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
229d0 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
229e0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
229f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43  E_OK ){.      pC
22a10 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
22a20 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
22a30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22a40 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
22a50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  age = 0;..    /*
22a60 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
22a70 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
22a80 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
22a90 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
22aa0 20 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65   cursor.    ** e
22ab0 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
22ac0 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
22ad0 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
22ae0 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
22af0 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  .    ** NULL, th
22b00 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
22b10 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
22b20 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
22b30 74 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a  the case,.    **
22b40 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
22b50 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
22b60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
22b70 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
22b80 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
22b90 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22ba0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
22bb0 20 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79   if( (pCur->pKey
22bc0 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e  Info==0)!=pCur->
22bd0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
22be0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
22bf0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22c00 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
22c10 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
22c20 61 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  at the root page
22c30 20 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65   is of the corre
22c40 63 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75  ct type. This mu
22c50 73 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63  st be the.  ** c
22c60 61 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20  ase as the call 
22c70 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22c80 20 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65   that loaded the
22c90 20 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68   root-page (eith
22ca0 65 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c  er.  ** this cal
22cb0 6c 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20  l or a previous 
22cc0 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c  invocation) woul
22cd0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
22ce0 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a  corruption .  **
22cf0 20 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69   if the assumpti
22d00 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
22d10 2c 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  , and it is not 
22d20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
22d30 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74   flags .  ** byt
22d40 65 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d  e to have been m
22d50 6f 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68  odified while th
22d60 69 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c  is cursor is hol
22d70 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65  ding a reference
22d80 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  .  ** to the pag
22d90 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d  e.  */.  pRoot =
22da0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
22db0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
22dc0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
22dd0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73  gnoRoot );.  ass
22de0 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
22df0 69 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65  it && (pCur->pKe
22e00 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74  yInfo==0)==pRoot
22e10 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70  ->intKey );..  p
22e20 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
22e30 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
22e40 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22e50 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20  r->atLast = 0;. 
22e60 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22e70 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f   = 0;..  if( pRo
22e80 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  ot->nCell==0 && 
22e90 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
22ea0 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
22eb0 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
22ec0 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
22ed0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
22ee0 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
22ef0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
22f00 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
22f10 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
22f20 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
22f30 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
22f40 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
22f50 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
22f60 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
22f70 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
22f80 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65  e = ((pRoot->nCe
22f90 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c  ll>0)?CURSOR_VAL
22fa0 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  ID:CURSOR_INVALI
22fb0 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  D);.  }.  return
22fc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
22fd0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
22fe0 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
22ff0 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
23000 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
23010 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
23020 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
23030 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
23040 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
23050 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
23060 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
23070 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
23080 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
23090 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
230a0 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
230b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
230c0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
230d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
230e0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
230f0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
23100 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23110 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23120 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
23130 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23140 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
23150 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
23160 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
23170 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23180 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
23190 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
231a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
231b0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
231c0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
231d0 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
231e0 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  age, pCur->aiIdx
231f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b  [pCur->iPage]));
23200 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
23210 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
23220 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23230 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
23240 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
23250 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  n to the right-m
23260 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
23270 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61  eneath the.** pa
23280 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ge to which it i
23290 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
232a0 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68  ting.  Notice th
232b0 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20  e difference.** 
232c0 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65  between moveToLe
232d0 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76  ftmost() and mov
232e0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20  eToRightmost(). 
232f0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23300 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c  ).** finds the l
23310 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  eft-most entry b
23320 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72  eneath the *entr
23330 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54  y* whereas moveT
23340 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20  oRightmost().** 
23350 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d  finds the right-
23360 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
23370 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a  th the *page*..*
23380 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d  *.** The right-m
23390 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65  ost entry is the
233a0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61   one with the la
233b0 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  rgest key - the 
233c0 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61  last.** key in a
233d0 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
233e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
233f0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74  veToRightmost(Bt
23400 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23410 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
23420 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23430 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
23440 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
23450 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23460 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
23470 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
23480 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23490 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
234a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
234b0 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
234c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
234d0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
234e0 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
234f0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
23500 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
23510 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  8]);.    pCur->a
23520 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23530 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
23540 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
23550 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
23560 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  o);.  }.  if( rc
23570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23580 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
23590 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
235a0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
235b0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
235c0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
235d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
235e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
235f0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
23600 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
23610 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
23620 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
23630 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
23640 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
23650 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
23660 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
23670 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
23680 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
23690 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
236a0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
236b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
236c0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
236d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
236e0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
236f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23700 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23710 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
23720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23730 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
23740 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
23750 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
23760 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
23770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23780 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
23790 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
237a0 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ID ){.      asse
237b0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
237c0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
237d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
237e0 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
237f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
23800 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23820 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23830 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
23840 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
23850 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
23860 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
23870 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
23890 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
238a0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
238b0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
238c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
238d0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
238e0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
238f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
23900 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
23910 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
23920 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
23930 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
23940 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
23950 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
23960 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
23970 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
23980 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
23990 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
239a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
239b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
239c0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
239d0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
239e0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
239f0 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
23a00 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
23a10 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
23a20 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
23a30 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
23a40 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
23a50 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
23a60 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
23a70 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
23a80 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
23a90 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
23aa0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
23ab0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
23ac0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
23ad0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
23ae0 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
23af0 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
23b00 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
23b10 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
23b20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
23b30 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
23b40 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
23b50 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
23b60 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
23b70 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
23b80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23b90 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
23ba0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
23bb0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23bc0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
23bd0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
23be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23bf0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
23c00 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
23c10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
23c30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
23c40 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
23c50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
23c60 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
23c70 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
23c80 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
23c90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
23ca0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
23cb0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
23cc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23cd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23ce0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
23cf0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
23d00 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
23d10 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
23d20 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
23d30 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20  ITE_OK ?1:0;.   
23d40 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23d50 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
23d60 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
23d70 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
23d80 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
23d90 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
23da0 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
23db0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
23dc0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
23dd0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
23de0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
23df0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
23e00 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
23e10 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
23e20 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
23e30 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
23e40 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
23e50 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
23e60 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
23e70 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
23e80 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
23e90 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
23ea0 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
23eb0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
23ec0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
23ed0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
23ee0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
23ef0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
23f00 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
23f10 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
23f20 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
23f30 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
23f40 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
23f50 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
23f60 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
23f70 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
23f80 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
23f90 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
23fa0 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
23fb0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
23fc0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
23fd0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
23fe0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
23ff0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
24000 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
24010 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
24020 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
24030 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
24040 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
24060 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
24070 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
24080 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
24090 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
240a0 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
240b0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
240c0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
240d0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
240e0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
240f0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
24100 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
24110 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
24120 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24130 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
24140 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
24150 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
24160 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
24170 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
24180 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
24190 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
241b0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
241c0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
241d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
241e0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
241f0 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
24200 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ur,          /* 
24210 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
24220 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61   moved */.  Unpa
24230 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
24240 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64  Key, /* Unpacked
24250 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
24260 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20  i64 intKey,     
24270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24280 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69  table key */.  i
24290 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20  nt biasRight,   
242a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
242b0 75 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61  ue, bias the sea
242c0 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20  rch to the high 
242d0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  end */.  int *pR
242e0 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
242f0 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
24300 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
24310 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  /.){.  int rc;..
24320 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24330 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24360 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24370 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
24380 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20  ssert( pRes );. 
24390 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65   assert( (pIdxKe
243a0 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b  y==0)==(pCur->pK
243b0 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20  eyInfo==0) );.. 
243c0 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
243d0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73  r is already pos
243e0 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70  itioned at the p
243f0 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69  oint we are tryi
24400 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20  ng.  ** to move 
24410 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65  to, then just re
24420 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
24430 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20  ng any work */. 
24440 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
24450 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
24460 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  && pCur->validNK
24470 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ey .   && pCur->
24480 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
24490 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  y .  ){.    if( 
244a0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  pCur->info.nKey=
244b0 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
244c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
244d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
244e0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
244f0 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26  ( pCur->atLast &
24500 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  & pCur->info.nKe
24510 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
24520 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
24530 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24540 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24550 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
24560 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
24570 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
24580 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
24590 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
245a0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
245b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
245c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
245d0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
245e0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
245f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
24600 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
24610 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
24620 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
24630 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
24640 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24650 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
24660 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24670 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
24680 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
24690 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
246a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
246b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
246c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
246d0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
246e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
246f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
24700 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
24710 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b  ey || pIdxKey );
24720 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
24730 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64  int lwr, upr, id
24740 78 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  x;.    Pgno chld
24750 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
24760 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
24770 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24780 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a  e];.    int c;..
24790 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43      /* pPage->nC
247a0 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61  ell must be grea
247b0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49  ter than zero. I
247c0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f  f this is the ro
247d0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74  ot-page.    ** t
247e0 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  he cursor would 
247f0 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49  have been INVALI
24800 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73  D above and this
24810 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20   for(;;) loop.  
24820 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66    ** not run. If
24830 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
24840 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e   root-page, then
24850 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64   the moveToChild
24860 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  () routine.    *
24870 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72  * would have alr
24880 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62  eady detected db
24890 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d   corruption. Sim
248a0 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75  ilarly, pPage mu
248b0 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65  st.    ** be the
248c0 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64   right kind (ind
248d0 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20  ex or table) of 
248e0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68  b-tree page. Oth
248f0 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20  erwise.    ** a 
24900 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72  moveToChild() or
24910 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61   moveToRoot() ca
24920 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65  ll would have de
24930 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f  tected corruptio
24940 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  n.  */.    asser
24950 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
24960 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
24970 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d   pPage->intKey==
24980 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a  (pIdxKey==0) );.
24990 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
249a0 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
249b0 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62  ell-1;.    if( b
249c0 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20  iasRight ){.    
249d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
249e0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
249f0 36 29 28 69 64 78 20 3d 20 75 70 72 29 3b 0a 20  6)(idx = upr);. 
24a00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24a10 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
24a20 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
24a30 28 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  (idx = (upr+lwr)
24a40 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
24a50 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38  or(;;){.      u8
24a60 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
24a90 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
24aa0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20  pPage */..      
24ab0 61 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75  assert( idx==pCu
24ac0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24ad0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 20 20 70  Page] );.      p
24ae0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
24af0 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  = 0;.      pCell
24b00 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
24b10 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d  e, idx) + pPage-
24b20 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
24b30 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24b40 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
24b50 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
24b60 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24b70 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
24b80 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d          u32 dumm
24b90 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
24ba0 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ll += getVarint3
24bb0 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b  2(pCell, dummy);
24bc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24bd0 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
24be0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
24bf0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
24c00 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b  ( nCellKey==intK
24c10 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
24c20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  c = 0;.        }
24c30 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
24c40 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y<intKey ){.    
24c50 20 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20        c = -1;.  
24c60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
24c80 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29  CellKey>intKey )
24c90 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
24ca0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
24cb0 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
24cc0 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  dNKey = 1;.     
24cd0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
24ce0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
24cf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24d00 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
24d10 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67  um supported pag
24d20 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20  e-size is 65536 
24d30 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e  bytes. This mean
24d40 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
24d50 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * the maximum nu
24d60 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62  mber of record b
24d70 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61  ytes stored on a
24d80 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20  n index B-Tree. 
24d90 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
24da0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38  s less than 1638
24db0 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20  4 bytes and may 
24dc0 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32  be stored as a 2
24dd0 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  -byte.        **
24de0 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e   varint. This in
24df0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
24e00 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  d to attempt to 
24e10 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20  avoid parsing . 
24e20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e         ** the en
24e30 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65  tire cell by che
24e40 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61  cking for the ca
24e50 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65  ses where the re
24e60 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20  cord is .       
24e70 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72   ** stored entir
24e80 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62  ely within the b
24e90 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e  -tree page by in
24ea0 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72  specting the fir
24eb0 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32  st .        ** 2
24ec0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65   bytes of the ce
24ed0 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ll..        */. 
24ee0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c         int nCell
24ef0 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20   = pCell[0];.   
24f00 20 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c       if( !(nCell
24f10 20 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c   & 0x80) && nCel
24f20 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  l<=pPage->maxLoc
24f30 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
24f40 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72  /* This branch r
24f50 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72  uns if the recor
24f60 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  d-size field of 
24f70 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20  the cell is a.  
24f80 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c          ** singl
24f90 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  e byte varint an
24fa0 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74  d the record fit
24fb0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
24fc0 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20  e main.         
24fd0 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e   ** b-tree page.
24fe0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
24ff0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
25000 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
25010 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
25020 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [1], pIdxKey);. 
25030 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
25040 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78   !(pCell[1] & 0x
25050 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26  80) .          &
25060 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65  & (nCell = ((nCe
25070 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70  ll&0x7f)<<7) + p
25080 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d  Cell[1])<=pPage-
25090 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20  >maxLocal.      
250a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f    ){.          /
250b0 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  * The record-siz
250c0 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62  e field is a 2 b
250d0 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
250e0 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20  he record .     
250f0 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74       ** fits ent
25100 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
25110 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  n b-tree page.  
25120 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  */.          c =
25130 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
25140 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
25150 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
25160 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
25170 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25180 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
25190 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
251a0 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
251b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
251c0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
251d0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
251e0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
251f0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
25200 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
25210 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
25220 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
25230 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
25240 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
25250 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
25260 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
25270 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
25280 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
25290 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
252a0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
252b0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
252c0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
252d0 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
252e0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
252f0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
25300 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
25310 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
25320 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
25330 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
25340 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
25350 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
25360 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
25370 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
25380 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
25390 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
253a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
253b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
253c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
253d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
253e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
253f0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
25400 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
25410 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
25420 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
25430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25440 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
25450 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25460 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
25470 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
25480 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
25490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
254a0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
254b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
254c0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
254d0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
254e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
254f0 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
25500 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25510 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
25520 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
25530 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
25540 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
25550 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
25560 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
25570 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
25580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
255a0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
255b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
255c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
255d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
255e0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
255f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25600 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
25610 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
25620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25630 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
25640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25650 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
25660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25670 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
25680 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25690 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
256a0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  = (lwr+upr)/2);.
256b0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
256c0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a  ( lwr==upr+1 );.
256d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
256e0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
256f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
25700 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
25710 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
25720 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
25730 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
25740 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
25750 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
25760 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
25770 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
25780 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
25790 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
257a0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
257b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c     }.    if( chl
257c0 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dPg==0 ){.      
257d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
257e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
257f0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
25800 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
25810 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  l );.      *pRes
25820 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
25830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25840 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
25850 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nish;.    }.    
25860 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25870 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
25880 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69  lwr;.    pCur->i
25890 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
258a0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
258b0 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  ey = 0;.    rc =
258c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
258d0 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20  r, chldPg);.    
258e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f  if( rc ) goto mo
258f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d  veto_finish;.  }
25900 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
25910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25920 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
25930 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  UE if the cursor
25940 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
25950 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20   at an entry of 
25960 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
25970 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65   TRUE will be re
25980 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63  turned after a c
25990 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
259a0 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a  reeNext() moves.
259b0 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  ** past the last
259c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
259d0 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74  ble or sqlite3Bt
259e0 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20  reePrev() moves 
259f0 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73  past.** the firs
25a00 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69  t entry.  TRUE i
25a10 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
25a20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
25a30 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
25a40 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74  lite3BtreeEof(Bt
25a50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25a60 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69   /* TODO: What i
25a70 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
25a80 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  in CURSOR_REQUIR
25a90 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61  ESEEK but all ta
25aa0 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a  ble entries.  **
25ab0 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
25ac0 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c  ed? This API wil
25ad0 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65  l need to change
25ae0 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72   to return an er
25af0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73  ror code.  ** as
25b00 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f   well as the boo
25b10 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75  lean result valu
25b20 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
25b30 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d   (CURSOR_VALID!=
25b40 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d  pCur->eState);.}
25b50 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
25b60 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
25b70 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
25b80 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
25b90 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
25ba0 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
25bb0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
25bc0 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
25bd0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
25be0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
25bf0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
25c00 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
25c10 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
25c20 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
25c30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
25c40 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
25c50 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
25c60 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
25c70 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
25c80 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
25c90 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25ca0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25cb0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25cc0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25cd0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
25ce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
25cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25d00 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
25d10 29 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  );.  if( CURSOR_
25d20 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
25d30 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
25d40 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
25d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
25d60 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
25d70 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20  ipNext>0 ){.    
25d80 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
25d90 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
25da0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
25db0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
25dc0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
25dd0 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43  0;..  pPage = pC
25de0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25df0 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
25e00 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
25e10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
25e20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
25e30 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
25e40 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43  ( idx<=pPage->nC
25e50 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e  ell );..  pCur->
25e60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
25e70 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
25e80 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78  y = 0;.  if( idx
25e90 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
25ea0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
25eb0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
25ec0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
25ed0 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
25ee0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
25ef0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
25f00 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
25f10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25f20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
25f30 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
25f40 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25f50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
25f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
25f70 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
25f80 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
25f90 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
25fa0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
25fb0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
25fc0 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65  ALID;.        re
25fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
25fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
25ff0 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
26000 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
26010 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26020 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
26030 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
26040 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e  dx[pCur->iPage]>
26050 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
26060 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
26070 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26080 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
26090 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
260a0 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
260b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
260c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
260d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  K;.    }.    ret
260e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70  urn rc;.  }.  *p
260f0 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Res = 0;.  if( p
26100 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26120 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d  OK;.  }.  rc = m
26130 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
26140 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ur);.  return rc
26150 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70  ;.}.../*.** Step
26160 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
26170 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  he back to the p
26180 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e  revious entry in
26190 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
261a0 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  If.** successful
261b0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
261c0 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  0.  If the curso
261d0 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79  r.** was already
261e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
261f0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
26200 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
26210 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
26220 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
26230 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
26240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26250 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
26260 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
26270 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
26280 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
26290 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
262a0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
262b0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
262c0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
262d0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
262e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
262f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
26300 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
26310 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69  >atLast = 0;.  i
26320 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
26330 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
26340 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
26350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26360 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
26370 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
26380 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  <0 ){.    pCur->
26390 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
263a0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
263b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
263c0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
263d0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
263e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
263f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26400 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ];.  assert( pPa
26410 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
26420 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
26430 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20   ){.    int idx 
26440 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
26450 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
26460 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
26470 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
26480 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
26490 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20  idx)));.    if( 
264a0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
264b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
264c0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
264d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
264e0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
264f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26500 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
26510 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
26520 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
26530 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
26540 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
26550 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
26560 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
26570 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
26590 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
265a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
265b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
265c0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
265d0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20  dNKey = 0;..    
265e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
265f0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
26600 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
26610 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26620 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
26630 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
26640 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
26660 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
26670 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
26680 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
26690 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
266a0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
266b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
266c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
266d0 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20  a new page from 
266e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
266f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  e..**.** The new
26700 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20   page is marked 
26710 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f  as dirty.  (In o
26720 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69  ther words, sqli
26730 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 0a  te3PagerWrite().
26740 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ** has already b
26750 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
26760 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68  e new page.)  Th
26770 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20 61  e new page has a
26780 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65  lso.** been refe
26790 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63  renced and the c
267a0 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  alling routine i
267b0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
267c0 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c  r calling.** sql
267d0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
267e0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
267f0 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
26800 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26810 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
26820 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f   success.  Any o
26830 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
26840 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61  e indicates.** a
26850 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67  n error.  *ppPag
26860 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65  e and *pPgno are
26870 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
26880 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
26890 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ror..** Do not i
268a0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67  nvoke sqlite3Pag
268b0 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70  erUnref() on *pp
268c0 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72  Page if an error
268d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
268e0 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72  .** If the "near
268f0 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  by" parameter is
26900 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28   not 0, then a (
26910 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69  feeble) effort i
26920 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f  s made to .** lo
26930 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73  cate a page clos
26940 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75  e to the page nu
26950 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20  mber "nearby".  
26960 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
26970 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70   in an.** attemp
26980 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65  t to keep relate
26990 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f  d pages close to
269a0 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74   each other in t
269b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
269c0 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75  ,.** which in tu
269d0 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61  rn can make data
269e0 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74  base access fast
269f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
26a00 20 22 65 78 61 63 74 22 20 70 61 72 61 6d 65 74   "exact" paramet
26a10 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64  er is not 0, and
26a20 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
26a30 20 6e 65 61 72 62 79 20 65 78 69 73 74 73 20 0a   nearby exists .
26a40 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
26a50 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
26a60 65 6e 20 69 74 20 69 73 20 67 75 61 72 65 6e 74  en it is guarent
26a70 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
26a80 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  ed. This.** is o
26a90 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75 74 6f  nly used by auto
26aa0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
26ab0 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e  s when allocatin
26ac0 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a  g a new table..*
26ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
26ae0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 0a  ocateBtreePage(.
26af0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
26b00 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70   .  MemPage **pp
26b10 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70  Page, .  Pgno *p
26b20 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65  Pgno, .  Pgno ne
26b30 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74  arby,.  u8 exact
26b40 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
26b50 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
26b60 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
26b70 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
26b80 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
26b90 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
26ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
26bb0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
26bc0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
26bd0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
26be0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
26bf0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
26c00 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
26c10 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
26c20 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
26c30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
26c40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26c50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
26c60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
26c70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
26c80 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20  ge1;.  mxPage = 
26c90 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
26ca0 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62  Bt);.  n = get4b
26cb0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26cc0 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
26cd0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
26ce0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
26cf0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
26d00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
26d10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
26d20 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
26d30 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
26d40 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
26d50 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
26d60 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
26d70 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
26d80 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
26d90 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
26da0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
26db0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
26dc0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
26dd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
26de0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
26df0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
26e00 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
26e10 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
26e20 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
26e30 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
26e40 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
26e50 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
26e60 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
26e70 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
26e80 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
26e90 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
26ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26eb0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
26ec0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
26ed0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
26ee0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
26ef0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
26f00 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
26f10 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
26f20 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
26f30 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
26f40 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
26f50 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
26f60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
26f70 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
26f80 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
26f90 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
26fa0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
26fb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
26fc0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
26fd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
26fe0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
26ff0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
27000 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
27010 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
27020 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
27030 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
27040 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
27050 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
27060 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
27070 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27080 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
27090 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
270a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
270b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
270c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
270d0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
270e0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
270f0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
27100 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
27110 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
27120 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
27130 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
27140 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
27150 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
27160 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
27170 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
27180 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
27190 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
271a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
271b0 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
271c0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
271d0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
271e0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
271f0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
27200 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
27210 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
27220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
27230 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
27240 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
27250 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
27260 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
27270 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
27280 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
27290 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
272a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
272b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
272c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
272d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
272e0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
272f0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
27300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
27310 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
27320 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
27330 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27340 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
27350 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62  .      k = get4b
27360 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
27370 74 61 5b 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20  ta[4]); /* # of 
27380 6c 65 61 76 65 73 20 6f 6e 20 74 68 69 73 20 74  leaves on this t
27390 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  runk page */.   
273a0 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
273b0 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
273c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
273d0 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
273e0 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
273f0 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
27400 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
27410 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
27420 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
27430 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
27440 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
27450 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
27460 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
27470 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
27480 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
27490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
274a0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
274b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
274c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
274d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
274e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
274f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27500 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
27510 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
27520 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27530 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
27540 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
27550 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
27560 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
27570 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
27580 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
27590 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
275a0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
275b0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
275c0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
275d0 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d  if( k>(u32)(pBt-
275e0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
275f0 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
27600 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f   Value of k is o
27610 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61  ut of range.  Da
27620 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
27630 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  n */.        rc 
27640 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
27650 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
27660 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27670 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53  _page;.#ifndef S
27680 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
27690 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73  ACUUM.      }els
276a0 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74  e if( searchList
276b0 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75   && nearby==iTru
276c0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
276d0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
276e0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
276f0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
27700 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
27710 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
27720 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
27730 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
27740 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
27750 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
27760 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75  rt( *pPgno==iTru
27770 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  nk );.        *p
27780 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
27790 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69          searchLi
277a0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
277b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
277c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
277d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
277e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
277f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
27800 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
27810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27820 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( k==0 ){.     
27830 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
27840 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
27850 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
27860 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
27870 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
27880 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27890 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
278a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
278b0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
278c0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
278d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
278e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
278f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
27900 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27910 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
27920 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27930 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
27940 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
27950 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
27960 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27970 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
27980 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
27990 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
279a0 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
279b0 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
279c0 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
279d0 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
279e0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
279f0 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
27a00 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
27a10 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
27a20 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
27a30 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
27a40 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
27a50 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
27a60 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
27a70 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
27a80 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
27a90 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
27aa0 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
27ab0 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
27ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27ad0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27ae0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
27af0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27b00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27b10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
27b20 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
27b30 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
27b40 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27b50 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
27b60 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
27b70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
27b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27b90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
27ba0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27bb0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
27bc0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
27bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27be0 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
27bf0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
27c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27c20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
27c30 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
27c40 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27c50 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27c60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27c70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
27c80 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
27c90 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27ca0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27cb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
27cc0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
27cd0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
27ce0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
27cf0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
27d00 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
27d10 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
27d20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
27d30 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
27d40 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
27d50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
27d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27d70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
27d80 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
27d90 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
27da0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
27db0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27dc0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
27dd0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
27de0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
27df0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27e00 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
27e10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
27e20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
27e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
27e40 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27e50 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
27e60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27e70 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
27e80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27e90 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
27ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27eb0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
27ec0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
27ed0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
27ee0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
27ef0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
27f00 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
27f10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
27f20 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
27f30 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
27f40 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
27f50 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
27f60 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
27f70 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
27f80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
27f90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
27fa0 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
27fb0 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
27fc0 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
27fd0 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
27fe0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
27ff0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
28000 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
28010 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41   dist = sqlite3A
28020 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
28030 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
28040 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
28050 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
28060 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
28070 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
28080 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
28090 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
280a0 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
280b0 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
280c0 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
280d0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
280e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
280f0 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
28100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
28120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
28130 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
28140 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
28150 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
28160 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
28170 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
28180 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
28190 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
281a0 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
281b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
281c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
281d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
281e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
281f0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
28200 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
28210 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
28220 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
28230 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
28240 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  || iPage==nearby
28250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
28260 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
28270 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
28280 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
28290 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
282a0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
282b0 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
282c0 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
282d0 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
282e0 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
28310 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
28320 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
28330 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28340 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
28350 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
28360 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
28370 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
28380 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28390 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
283a0 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
283b0 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
283c0 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
283d0 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
283e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
283f0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28400 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
28410 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
28420 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
28430 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
28440 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
28450 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
28460 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
28470 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
28480 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
28490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
284a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
284b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
284c0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
284d0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
284e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
284f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
28510 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
28520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
28530 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28540 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
28550 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
28560 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
28570 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
28580 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
28590 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
285a0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
285b0 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
285c0 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
285d0 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
285e0 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
285f0 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
28600 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
28610 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
28620 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
28630 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
28640 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
28650 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
28660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28670 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
28680 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
28690 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
286a0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
286b0 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
286c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
286d0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
286e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
286f0 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
28700 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
28710 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
28720 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
28730 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
28740 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
28750 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
28760 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
28770 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
28780 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
28790 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
287a0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
287b0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
287c0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
287d0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
287e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
287f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28800 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
28810 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
28820 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
28830 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
28840 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
28850 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
28860 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
28870 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
28880 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28890 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
288a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
288b0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
288c0 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 20   &pPg, 1);.     
288d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
288e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
288f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28900 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
28910 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
28920 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
28930 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
28950 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
28960 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
28970 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
28980 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
28990 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
289a0 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
289b0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
289c0 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
289d0 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
289e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
289f0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
28a00 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
28a10 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
28a20 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
28a30 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
28a40 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
28a50 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31 29 3b 0a  no, ppPage, 1);.
28a60 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
28a70 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
28a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28a90 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
28aa0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
28ab0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28ac0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
28ad0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
28ae0 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
28af0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
28b00 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
28b10 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
28b20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
28b30 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
28b40 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
28b50 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
28b60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28b70 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
28b80 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
28b90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
28bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
28bc0 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
28bd0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
28be0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
28bf0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
28c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28c10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
28c20 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
28c30 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
28c40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
28c50 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
28c60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
28c70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
28c80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28c90 6c 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  le((*ppPage)->pD
28ca0 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
28cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28cc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
28cd0 20 75 73 65 64 20 74 6f 20 61 64 64 20 70 61 67   used to add pag
28ce0 65 20 69 50 61 67 65 20 74 6f 20 74 68 65 20 64  e iPage to the d
28cf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 65  atabase file fre
28d00 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69  e-list. .** It i
28d10 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
28d20 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
28d30 6c 72 65 61 64 79 20 61 20 70 61 72 74 20 6f 66  lready a part of
28d40 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
28d50 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
28d60 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
28d70 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
28d80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28d90 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49  s optional..** I
28da0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70  f the caller hap
28db0 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70  pens to have a p
28dc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65  ointer to the Me
28dd0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  mPage object .**
28de0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
28df0 6f 20 70 61 67 65 20 69 50 61 67 65 20 68 61 6e  o page iPage han
28e00 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  dy, it may pass 
28e10 69 74 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  it as the second
28e20 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65   value. .** Othe
28e30 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61  rwise, it may pa
28e40 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49  ss NULL..**.** I
28e50 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  f a pointer to a
28e60 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
28e70 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
28e80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
28e90 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e  ,.** its referen
28ea0 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20  ce count is not 
28eb0 61 6c 74 65 72 65 64 20 62 79 20 74 68 69 73 20  altered by this 
28ec0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
28ed0 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
28ee0 32 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  2(BtShared *pBt,
28ef0 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61   MemPage *pMemPa
28f00 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b  ge, Pgno iPage){
28f10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
28f20 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
28f30 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c         /* Free-l
28f40 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
28f50 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20  /.  Pgno iTrunk 
28f60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
28f70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
28f80 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c  number of free-l
28f90 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a  ist trunk page *
28fa0 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  / .  MemPage *pP
28fb0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
28fc0 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  e1;      /* Loca
28fd0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  l reference to p
28fe0 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61  age 1 */.  MemPa
28ff0 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20  ge *pPage;      
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29010 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66 72 65  * Page being fre
29020 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e  ed. May be NULL.
29030 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29060 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn Code */.  in
29070 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
290a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
290b0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
290c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
290d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
290e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
290f0 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b 0a 20  rt( iPage>1 );. 
29100 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
29110 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
29120 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
29130 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29    if( pMemPage )
29140 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d  {.    pPage = pM
29150 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69  emPage;.    sqli
29160 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67  te3PagerRef(pPag
29170 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  e->pDbPage);.  }
29180 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20  else{.    pPage 
29190 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
291a0 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  p(pBt, iPage);. 
291b0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65   }..  /* Increme
291c0 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65  nt the free page
291d0 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31   count on pPage1
291e0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
291f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29200 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
29210 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
29220 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e  reepage_out;.  n
29230 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
29240 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29250 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
29260 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29270 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20  6], nFree+1);.. 
29280 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65   if( pBt->secure
29290 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Delete ){.    /*
292a0 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64   If the secure_d
292b0 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20  elete option is 
292c0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
292d0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
292e0 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
292f0 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
29300 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
29310 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61  */.    if( (!pPa
29320 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72  ge && ((rc = btr
29330 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
29340 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
29350 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20  )!=0) ).     || 
29360 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20             ((rc 
29370 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29380 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
29390 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  ge))!=0).    ){.
293a0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
293b0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
293c0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
293d0 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
293e0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
293f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
29400 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
29410 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
29420 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79  , write an entry
29430 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
29440 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  map.  ** to indi
29450 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61  cate that the pa
29460 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f  ge is free..  */
29470 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
29480 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61  UUM ){.    ptrma
29490 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c  pPut(pBt, iPage,
294a0 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45   PTRMAP_FREEPAGE
294b0 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  , 0, &rc);.    i
294c0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
294d0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  epage_out;.  }..
294e0 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c    /* Now manipul
294f0 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64  ate the actual d
29500 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73  atabase free-lis
29510 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  t structure. The
29520 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20  re are two.  ** 
29530 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49  possibilities. I
29540 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
29550 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70  is currently emp
29560 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69  ty, or if the fi
29570 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70  rst.  ** trunk p
29580 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
29590 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68  list is full, th
295a0 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c  en this page wil
295b0 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20  l become a.  ** 
295c0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72  new free-list tr
295d0 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77  unk page. Otherw
295e0 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63  ise, it will bec
295f0 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68  ome a leaf of th
29600 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75  e.  ** first tru
29610 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  nk page in the c
29620 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74  urrent free-list
29630 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73  . This block tes
29640 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73  ts if it.  ** is
29650 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
29660 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e   the page as a n
29670 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ew free-list lea
29680 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  f..  */.  if( nF
29690 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33  ree!=0 ){.    u3
296a0 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20  2 nLeaf;        
296b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
296c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  al number of lea
296d0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b  f cells on trunk
296e0 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54   page */..    iT
296f0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
29700 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
29710 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  2]);.    rc = bt
29720 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29730 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
29740 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
29750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29760 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
29770 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
29780 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79    nLeaf = get4by
29790 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
297a0 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[4]);.    asser
297b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
297c0 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28  ze>32 );.    if(
297d0 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42   nLeaf > (u32)pB
297e0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
297f0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20  - 2 ){.      rc 
29800 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
29810 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
29820 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
29830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
29840 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e  eaf < (u32)pBt->
29850 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
29860 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
29870 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
29880 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
29890 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
298a0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
298b0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
298c0 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
298d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
298e0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
298f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
29900 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
29910 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
29920 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
29930 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
29940 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
29950 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
29960 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
29970 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
29980 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
29990 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
299a0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
299b0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
299c0 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
299d0 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
299e0 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
299f0 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
29a00 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
29a10 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
29a20 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
29a30 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
29a40 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
29a50 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
29a60 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
29a70 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
29a80 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
29a90 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
29aa0 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65  l continue to re
29ab0 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65  strict the numbe
29ac0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20  r of entries to 
29ad0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
29ae0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f  .      ** for no
29af0 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e  w.  At some poin
29b00 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
29b10 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68  (once everyone h
29b20 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20  as upgraded.    
29b30 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72    ** to 3.6.0 or
29b40 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c   later) we shoul
29b50 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e  d consider fixin
29b60 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61  g the conditiona
29b70 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a  l above.      **
29b80 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65   to read "usable
29b90 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61  Size/4-2" instea
29ba0 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65  d of "usableSize
29bb0 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a  /4-8"..      */.
29bc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29bd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
29be0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
29bf0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29c10 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
29c20 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c  nk->aData[4], nL
29c30 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  eaf+1);.        
29c40 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
29c50 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a  ->aData[8+nLeaf*
29c60 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  4], iPage);.    
29c70 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26      if( pPage &&
29c80 20 21 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c   !pBt->secureDel
29c90 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ete ){.         
29ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
29cb0 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  tWrite(pPage->pD
29cc0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29cd0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  }.        rc = b
29ce0 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
29cf0 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20  t(pBt, iPage);. 
29d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
29d10 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
29d20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b  %d leaf on trunk
29d30 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67   page %d\n",pPag
29d40 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e  e->pgno,pTrunk->
29d50 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f  pgno));.      go
29d60 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
29d80 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77   If control flow
29d90 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
29da0 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74   then it was not
29db0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64   possible to add
29dc0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61   the.  ** the pa
29dd0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ge being freed a
29de0 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66  s a leaf page of
29df0 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b   the first trunk
29e00 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
29e10 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  t..  ** Possibly
29e20 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65   because the fre
29e30 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c  e-list is empty,
29e40 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63   or possibly bec
29e50 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  ause the .  ** f
29e60 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
29e70 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
29e80 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ull. Either way,
29e90 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
29ea0 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20  freed.  ** will 
29eb0 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66  become the new f
29ec0 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
29ed0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
29ee0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
29ef0 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f  ge==0 && SQLITE_
29f00 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47  OK!=(rc = btreeG
29f10 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
29f20 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29  e, &pPage, 0)) )
29f30 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
29f40 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72  age_out;.  }.  r
29f50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29f60 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
29f70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
29f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f90 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
29fa0 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62  out;.  }.  put4b
29fb0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
29fc0 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74  , iTrunk);.  put
29fd0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
29fe0 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75  ata[4], 0);.  pu
29ff0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2a000 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65  aData[32], iPage
2a010 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45  );.  TRACE(("FRE
2a020 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74  E-PAGE: %d new t
2a030 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63  runk page replac
2a040 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ing %d\n", pPage
2a050 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29  ->pgno, iTrunk))
2a060 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a  ;..freepage_out:
2a070 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a  .  if( pPage ){.
2a080 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
2a090 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c  t = 0;.  }.  rel
2a0a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2a0b0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2a0c0 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
2a0d0 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f   rc;.}.static vo
2a0e0 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50  id freePage(MemP
2a0f0 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2a100 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70  *pRC){.  if( (*p
2a110 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  RC)==SQLITE_OK )
2a120 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65  {.    *pRC = fre
2a130 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42  ePage2(pPage->pB
2a140 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d  t, pPage, pPage-
2a150 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >pgno);.  }.}../
2a160 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76  *.** Free any ov
2a170 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73  erflow pages ass
2a180 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2a190 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a   given Cell..*/.
2a1a0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
2a1b0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2a1c0 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  age, unsigned ch
2a1d0 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74  ar *pCell){.  Bt
2a1e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2a1f0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c  age->pBt;.  Cell
2a200 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e  Info info;.  Pgn
2a210 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
2a220 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
2a230 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
2a240 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
2a250 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2a260 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2a270 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72  >mutex) );.  btr
2a280 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2a290 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
2a2a0 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
2a2b0 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a  iOverflow==0 ){.
2a2c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a2d0 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65  E_OK;  /* No ove
2a2e0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74  rflow pages. Ret
2a2f0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2a300 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  g anything */.  
2a310 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e  }.  if( pCell+in
2a320 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e  fo.iOverflow+3 >
2a330 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50   pPage->aData+pP
2a340 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b  age->maskPage ){
2a350 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a360 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20  TE_CORRUPT;  /* 
2a370 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73  Cell extends pas
2a380 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f  t end of page */
2a390 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20  .  }.  ovflPgno 
2a3a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
2a3b0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2a3c0 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  ]);.  assert( pB
2a3d0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20  t->usableSize > 
2a3e0 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53  4 );.  ovflPageS
2a3f0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
2a400 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76  eSize - 4;.  nOv
2a410 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  fl = (info.nPayl
2a420 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  oad - info.nLoca
2a430 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
2a440 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
2a450 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76  ze;.  assert( ov
2a460 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76  flPgno==0 || nOv
2a470 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  fl>0 );.  while(
2a480 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
2a490 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
2a4a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
2a4b0 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
2a4c0 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
2a4d0 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
2a4e0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
2a4f0 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
2a500 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
2a510 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
2a520 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
2a530 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
2a540 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
2a550 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
2a560 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2a570 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
2a580 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
2a590 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
2a5a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
2a5b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2a5c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2a5d0 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
2a5e0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
2a5f0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
2a600 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
2a610 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
2a620 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2a630 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2a640 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
2a650 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
2a660 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
2a670 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
2a680 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
2a690 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
2a6a0 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
2a6b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
2a6c0 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
2a6d0 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
2a6e0 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
2a6f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2a700 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
2a710 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2a720 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
2a730 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
2a740 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
2a750 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
2a760 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
2a770 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
2a780 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
2a790 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
2a7a0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
2a7b0 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
2a7c0 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
2a7d0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2a7e0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
2a7f0 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
2a800 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
2a810 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
2a820 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
2a830 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
2a840 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
2a850 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
2a860 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
2a870 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
2a880 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
2a890 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
2a8a0 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
2a8b0 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
2a8c0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
2a8d0 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
2a8e0 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
2a8f0 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
2a900 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
2a910 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
2a920 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
2a930 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2a940 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a950 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a960 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
2a970 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
2a980 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
2a990 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
2a9a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
2a9b0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
2a9c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
2a9d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2a9e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
2a9f0 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
2aa00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2aa10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
2aa20 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
2aa30 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
2aa40 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
2aa50 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
2aa60 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
2aa70 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
2aa80 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
2aa90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
2aaa0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
2aab0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
2aac0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
2aad0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
2aae0 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
2aaf0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
2ab00 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
2ab10 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
2ab20 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
2ab30 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
2ab40 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
2ab50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2ab60 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
2ab70 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
2ab80 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
2ab90 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
2aba0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
2abb0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
2abc0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
2abd0 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
2abe0 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
2abf0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
2ac00 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
2ac10 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
2ac20 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
2ac30 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2ac40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
2ac50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
2ac60 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2ac70 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
2ac80 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2ac90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
2aca0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
2acb0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
2acc0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2acd0 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2ace0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
2acf0 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
2ad00 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
2ad10 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
2ad20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
2ad30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2ad40 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
2ad50 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
2ad60 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
2ad70 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2ad80 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
2ad90 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
2ada0 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
2adb0 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
2adc0 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
2add0 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
2ade0 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
2adf0 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
2ae00 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
2ae10 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
2ae20 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
2ae30 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
2ae40 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
2ae50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2ae60 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
2ae70 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
2ae80 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
2ae90 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2aea0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2aeb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2aec0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2aed0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
2aee0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
2aef0 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
2af00 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
2af10 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
2af20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
2af30 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
2af40 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
2af50 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
2af60 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
2af70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
2af80 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
2af90 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2afa0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2afb0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2afc0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2afd0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2afe0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
2aff0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
2b000 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
2b010 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b020 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
2b030 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2b040 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
2b050 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2b060 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2b070 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
2b080 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
2b090 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
2b0a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
2b0b0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
2b0c0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2b0d0 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
2b0e0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2b0f0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2b100 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
2b110 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
2b120 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
2b130 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
2b140 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
2b150 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
2b160 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
2b170 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
2b180 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2b190 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
2b1a0 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
2b1b0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
2b1c0 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
2b1d0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
2b1e0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
2b1f0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
2b200 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56  se{ .    if( NEV
2b210 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66  ER(nKey>0x7fffff
2b220 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29  ff || pKey==0) )
2b230 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2b240 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b250 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  PT;.    }.    nP
2b260 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e  ayload += (int)n
2b270 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
2b280 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
2b290 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a   (int)nKey;.  }.
2b2a0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
2b2b0 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c  .nSize;.  spaceL
2b2c0 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  eft = info.nLoca
2b2d0 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  l;.  pPayload = 
2b2e0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
2b2f0 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
2b300 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2b310 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50  w];..  while( nP
2b320 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20  ayload>0 ){.    
2b330 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
2b340 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
2b350 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b360 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  UM.      Pgno pg
2b370 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f  noPtrmap = pgnoO
2b380 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  vfl; /* Overflow
2b390 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61   page pointer-ma
2b3a0 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a  p entry page */.
2b3b0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2b3c0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
2b3d0 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
2b3e0 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20     pgnoOvfl++;. 
2b3f0 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20         } while( 
2b400 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41  .          PTRMA
2b410 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67  P_ISPAGE(pBt, pg
2b420 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f  noOvfl) || pgnoO
2b430 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  vfl==PENDING_BYT
2b440 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20  E_PAGE(pBt) .   
2b450 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
2b460 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
2b470 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
2b480 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c  age(pBt, &pOvfl,
2b490 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f   &pgnoOvfl, pgno
2b4a0 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65  Ovfl, 0);.#ifnde
2b4b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2b4c0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
2b4d0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2b4e0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
2b4f0 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20  vacuum, and the 
2b500 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71  second or subseq
2b510 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76  uent.      ** ov
2b520 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62  erflow page is b
2b530 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20  eing allocated, 
2b540 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  add an entry to 
2b550 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2b560 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61        ** for tha
2b570 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20  t page now. .   
2b580 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2b590 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
2b5a0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
2b5b0 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  e, then write a 
2b5c0 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20  partial entry . 
2b5d0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70       ** to the p
2b5e0 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77  ointer-map. If w
2b5f0 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20  e write nothing 
2b600 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d  to this pointer-
2b610 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20  map slot,.      
2b620 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69  ** then the opti
2b630 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20  mistic overflow 
2b640 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  chain processing
2b650 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a   in clearCell().
2b660 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73        ** may mis
2b670 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e  interpret the un
2b680 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75  initialised valu
2b690 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  es and delete th
2b6a0 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67  e.      ** wrong
2b6b0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
2b6c0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
2b6d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
2b6e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
2b6f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b700 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2b710 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f  e = (pgnoPtrmap?
2b720 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
2b730 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  :PTRMAP_OVERFLOW
2b740 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  1);.        ptrm
2b750 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
2b760 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
2b770 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20  Ptrmap, &rc);.  
2b780 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2b790 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2b7a0 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20  ePage(pOvfl);.  
2b7b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b7c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
2b7d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
2b7e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2b7f0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  lease);.        
2b800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2b810 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2b820 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2b830 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69  t zero than pPri
2b840 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  or points into t
2b850 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
2b860 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2b870 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2b880 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2b890 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2b8a0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2b8b0 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c  pToRelease==0 ||
2b8c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2b8d0 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65  riteable(pToRele
2b8e0 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ase->pDbPage) );
2b8f0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50  ..      /* If pP
2b900 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20  rior is part of 
2b910 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66  the data area of
2b920 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b   pPage, then mak
2b930 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20  e sure pPage.   
2b940 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77     ** is still w
2b950 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20  riteable */.    
2b960 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
2b970 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2b980 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d   pPrior>=&pPage-
2b990 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
2b9a0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
2b9b0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
2b9c0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2b9d0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2b9e0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2b9f0 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c  pPrior, pgnoOvfl
2ba00 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2ba10 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2ba20 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61  ;.      pToRelea
2ba30 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20  se = pOvfl;.    
2ba40 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c    pPrior = pOvfl
2ba50 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70  ->aData;.      p
2ba60 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
2ba70 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f  0);.      pPaylo
2ba80 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61  ad = &pOvfl->aDa
2ba90 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61  ta[4];.      spa
2baa0 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73  ceLeft = pBt->us
2bab0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
2bac0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79    }.    n = nPay
2bad0 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e  load;.    if( n>
2bae0 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20  spaceLeft ) n = 
2baf0 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20  spaceLeft;..    
2bb00 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2bb10 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2bb20 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74  n pPayload point
2bb30 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
2bb40 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70  area.    ** of p
2bb50 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2bb60 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2bb70 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2bb80 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ble. */.    asse
2bb90 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2bba0 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2bbb0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2bbc0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2bbd0 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ) );..    /* If 
2bbe0 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74  pPayload is part
2bbf0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2bc00 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2bc10 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2bc20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
2bc30 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2bc40 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f    assert( pPaylo
2bc50 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ad<pPage->aData 
2bc60 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50  || pPayload>=&pP
2bc70 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2bc80 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2bc90 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2bca0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bcb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bcc0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72   );..    if( nSr
2bcd0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
2bce0 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
2bcf0 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
2bd00 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
2bd10 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
2bd20 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
2bd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
2bd40 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
2bd50 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
2bd60 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
2bd70 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
2bd80 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
2bd90 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
2bda0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
2bdb0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
2bdc0 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
2bdd0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
2bde0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
2bdf0 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
2be00 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2be10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2be20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
2be30 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
2be40 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
2be50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
2be60 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
2be70 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
2be80 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
2be90 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
2bea0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
2beb0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
2bec0 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
2bed0 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
2bee0 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
2bef0 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
2bf00 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
2bf10 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
2bf20 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
2bf30 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
2bf40 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
2bf50 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
2bf60 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
2bf70 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
2bf80 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
2bf90 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
2bfa0 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
2bfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2bfc0 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
2bfd0 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
2bfe0 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
2bff0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
2c000 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
2c010 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
2c020 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
2c030 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
2c040 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
2c050 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20  .  u8 *endPtr;  
2c060 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f     /* End of loo
2c070 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  p */.  int rc;  
2c080 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2c090 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2c0a0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
2c0b0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
2c0c0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
2c0d0 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
2c0e0 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
2c0f0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2c100 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
2c110 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
2c120 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
2c130 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
2c140 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
2c150 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2c160 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c170 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2c180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c190 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c1a0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2c1b0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
2c1c0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
2c1d0 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2c1e0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
2c1f0 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
2c200 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
2c210 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
2c220 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
2c230 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
2c240 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
2c250 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
2c260 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
2c270 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2c280 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
2c290 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2c2a0 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
2c2b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2c2c0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
2c2d0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
2c2e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
2c2f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
2c300 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
2c310 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
2c320 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
2c330 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
2c340 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d  ;.  }.  endPtr =
2c350 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65   &data[pPage->ce
2c360 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2c370 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a  ge->nCell - 2];.
2c380 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
2c390 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72  E_PTR_TO_INT(ptr
2c3a0 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70  )&1)==0 );  /* p
2c3b0 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62  tr is always 2-b
2c3c0 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20  yte aligned */. 
2c3d0 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e 64 50   while( ptr<endP
2c3e0 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a  tr ){.    *(u16*
2c3f0 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70  )ptr = *(u16*)&p
2c400 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b  tr[2];.    ptr +
2c410 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 2;.  }.  pPage
2c420 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
2c430 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2c440 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2c450 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2c460 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
2c470 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
2c480 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
2c490 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
2c4a0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
2c4b0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
2c4c0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
2c4d0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
2c4e0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
2c4f0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
2c500 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
2c510 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
2c520 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
2c530 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
2c540 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
2c550 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
2c560 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
2c570 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
2c580 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
2c590 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
2c5a0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
2c5b0 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
2c5c0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
2c5d0 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
2c5e0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
2c5f0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
2c600 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
2c610 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
2c620 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
2c630 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
2c640 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
2c650 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
2c660 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
2c670 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
2c680 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
2c690 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
2c6a0 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
2c6b0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
2c6c0 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
2c6d0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
2c6e0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
2c6f0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
2c700 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
2c710 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2c720 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
2c730 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
2c740 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
2c750 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
2c760 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
2c770 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
2c780 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c790 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
2c7a0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2c7b0 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
2c7c0 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
2c7d0 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
2c7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2c7f0 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
2c800 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
2c810 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
2c820 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
2c830 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
2c840 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
2c850 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
2c860 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
2c870 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
2c880 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
2c890 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
2c8a0 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
2c8b0 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
2c8c0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
2c8d0 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
2c8e0 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
2c8f0 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
2c900 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
2c910 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
2c920 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
2c930 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
2c940 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
2c950 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
2c960 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
2c970 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
2c980 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
2c990 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
2c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c9b0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
2c9c0 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  t end;          
2c9d0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
2c9e0 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  st the last cell
2c9f0 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2ca00 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b  [] */.  int ins;
2ca10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2ca20 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65  ex in data[] whe
2ca30 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e  re new cell poin
2ca40 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20  ter is inserted 
2ca50 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
2ca60 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73  set;   /* Addres
2ca70 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  s of first cell 
2ca80 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2ca90 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  ] */.  u8 *data;
2caa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cab0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
2cac0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
2cad0 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20  8 *ptr;         
2cae0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76   /* Used for mov
2caf0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
2cb00 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d  around in data[]
2cb10 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72   */.  u8 *endPtr
2cb20 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ;       /* End o
2cb30 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  f the loop */.. 
2cb40 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43   int nSkip = (iC
2cb50 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a  hild ? 4 : 0);..
2cb60 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
2cb70 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
2cb80 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
2cb90 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
2cba0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
2cbb0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2cbc0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2cbd0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2cbe0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2cbf0 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
2cc00 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2cc10 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
2cc20 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b 0a  Page->aOvfl) );.
2cc30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2cc40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2cc50 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2cc60 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
2cc70 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
2cc80 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
2cc90 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
2cca0 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
2ccb0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
2ccc0 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
2ccd0 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
2cce0 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
2ccf0 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
2cd00 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
2cd10 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
2cd20 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
2cd30 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
2cd40 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
2cd50 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
2cd60 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
2cd70 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
2cd80 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
2cd90 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
2cda0 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
2cdb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
2cdc0 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
2cdd0 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
2cde0 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2cdf0 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
2ce00 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
2ce10 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
2ce20 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
2ce30 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
2ce40 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
2ce50 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
2ce60 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
2ce70 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
2ce80 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
2ce90 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
2cea0 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2ceb0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
2cec0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2ced0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
2cee0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
2cef0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
2cf00 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
2cf10 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
2cf20 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20 29  ge->aOvfl[0])) )
2cf30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76  ;.    pPage->aOv
2cf40 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70 43  fl[j].pCell = pC
2cf50 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ell;.    pPage->
2cf60 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20 28  aOvfl[j].idx = (
2cf70 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  u16)i;.  }else{.
2cf80 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
2cf90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2cfa0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2cfb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cfc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2cfd0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2cfe0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2cff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d000 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d010 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2d020 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
2d030 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2d040 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
2d050 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
2d060 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
2d070 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
2d080 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73  ->nCell;.    ins
2d090 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2d0a0 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  2*i;.    rc = al
2d0b0 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
2d0c0 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
2d0d0 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
2d0e0 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
2d0f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
2d100 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
2d110 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
2d120 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
2d130 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
2d140 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
2d150 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   success */.    
2d160 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65  assert( idx >= e
2d170 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  nd+2 );.    asse
2d180 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
2d190 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
2d1a0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
2d1b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
2d1c0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
2d1d0 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
2d1e0 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
2d1f0 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
2d200 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2d210 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28  -nSkip);.    if(
2d220 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2d230 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
2d240 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
2d250 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20 26     }.    ptr = &
2d260 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20 65  data[end];.    e
2d270 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69 6e  ndPtr = &data[in
2d280 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  s];.    assert( 
2d290 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
2d2a0 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b  NT(ptr)&1)==0 );
2d2b0 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61    /* ptr is alwa
2d2c0 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65  ys 2-byte aligne
2d2d0 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20  d */.    while( 
2d2e0 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20 20  ptr>endPtr ){.  
2d2f0 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d      *(u16*)ptr =
2d300 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32 5d   *(u16*)&ptr[-2]
2d310 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20 32  ;.      ptr -= 2
2d320 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
2d330 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
2d340 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
2d350 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
2d360 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
2d370 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69  Page->nCell);.#i
2d380 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d390 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2d3a0 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
2d3b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2d3c0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
2d3d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
2d3e0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
2d3f0 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
2d400 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
2d410 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
2d420 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
2d430 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
2d440 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
2d450 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
2d460 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
2d470 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
2d480 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
2d490 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74  /*.** Add a list
2d4a0 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70   of cells to a p
2d4b0 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73  age.  The page s
2d4c0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
2d4d0 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65  ly empty..** The
2d4e0 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61   cells are guara
2d4f0 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20  nteed to fit on 
2d500 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2d510 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c  tic void assembl
2d520 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  ePage(.  MemPage
2d530 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68   *pPage,   /* Th
2d540 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73  e page to be ass
2d550 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74  emblied */.  int
2d560 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f   nCell,        /
2d570 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2d580 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
2d590 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2d5a0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
2d5b0 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20   /* Pointers to 
2d5c0 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20  cell bodies */. 
2d5d0 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20   u16 *aSize     
2d5e0 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74     /* Sizes of t
2d5f0 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  he cells */.){. 
2d600 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
2d610 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2d620 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  er */.  u8 *pCel
2d630 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64 64  lptr;     /* Add
2d640 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2d650 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
2d660 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
2d670 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2d680 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
2d690 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
2d6a0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2d6b0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2d6c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
2d6d0 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20  a for pPage */. 
2d6e0 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
2d6f0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2d700 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2d710 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
2d720 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 63   on pPage */.  c
2d730 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c 65  onst int nUsable
2d740 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
2d750 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73  sableSize; /* Us
2d760 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61 67  able size of pag
2d770 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
2d780 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d790 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2d7a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2d7b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2d7c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2d7d0 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20  rt( nCell>=0 && 
2d7e0 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43  nCell<=(int)MX_C
2d7f0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 0a  ELL(pPage->pBt).
2d800 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
2d810 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67  int)MX_CELL(pPag
2d820 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b  e->pBt)<=10921);
2d830 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d840 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d850 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2d860 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  e) );..  /* Chec
2d870 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2d880 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65  has just been ze
2d890 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65  roed by zeroPage
2d8a0 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  () */.  assert( 
2d8b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2d8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2d8d0 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
2d8e0 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2d8f0 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2d900 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2d910 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2d920 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2d930 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2d940 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2d950 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2d960 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69  u16 sz = aSize[i
2d970 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ];.    pCellptr 
2d980 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
2d990 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75  dy -= sz;.    pu
2d9a0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2d9b0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2d9c0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2d9d0 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2d9e0 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75  ], sz);.  }.  pu
2d9f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2da00 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2da10 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2da20 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2da30 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2da40 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2da50 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2da60 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2da70 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2da80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2da90 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2daa0 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2dab0 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2dac0 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2dad0 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2dae0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2daf0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2db00 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2db10 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2db20 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2db30 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2db40 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2db50 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2db60 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2db70 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2db80 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2db90 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2dba0 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2dbb0 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2dbc0 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2dbd0 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2dbe0 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2dbf0 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2dc00 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2dc10 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2dc20 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2dc30 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2dc40 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2dc50 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2dc60 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2dc70 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2dc80 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2dc90 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2dca0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2dcb0 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2dcc0 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2dcd0 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2dce0 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2dcf0 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2dd00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2dd10 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2dd20 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2dd30 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2dd40 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2dd50 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2dd60 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2dd70 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2dd80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2dd90 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2dda0 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2ddb0 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2ddc0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2ddd0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2dde0 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2ddf0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2de00 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2de10 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2de20 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2de30 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2de40 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2de50 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2de60 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2de70 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2de80 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2de90 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65  g to balance the
2dea0 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2deb0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2dec0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2ded0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2dee0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2def0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2df00 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2df10 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2df20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2df30 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2df40 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2df50 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2df60 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2df70 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2df80 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2df90 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2dfa0 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2dfb0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2dfc0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2dfd0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2dfe0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2dff0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2e000 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2e010 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2e020 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2e030 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2e040 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2e050 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2e060 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2e070 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2e080 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2e090 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2e0a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2e0b0 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2e0c0 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2e0d0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2e0e0 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2e0f0 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2e100 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2e110 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2e120 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2e130 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2e140 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2e150 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2e160 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2e170 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2e180 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2e190 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2e1a0 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2e1b0 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2e1c0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2e1d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2e1e0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2e1f0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2e200 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2e210 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2e220 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2e230 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2e240 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2e250 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2e260 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e280 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2e290 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2e2a0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2e2d0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2e2e0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2e2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2e300 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2e310 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2e320 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e330 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2e340 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2e350 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2e360 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2e370 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2e380 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e390 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2e3a0 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72  .  /* This error
2e3b0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
2e3c0 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
2e3d0 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
2e3e0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
2e3f0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2e400 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2e410 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2e420 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2e430 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
2e440 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2e450 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
2e460 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
2e470 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
2e480 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
2e490 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
2e4a0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
2e4b0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
2e4c0 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
2e4d0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
2e4e0 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
2e4f0 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
2e500 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2e510 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2e520 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
2e530 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2e540 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
2e550 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
2e560 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
2e570 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76  ell = pPage->aOv
2e580 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20  fl[0].pCell;.   
2e590 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65   u16 szCell = ce
2e5a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2e5b0 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20   pCell);.    u8 
2e5c0 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73  *pStop;..    ass
2e5d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2e5e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65  rIswriteable(pNe
2e5f0 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  w->pDbPage) );. 
2e600 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e610 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46  ->aData[0]==(PTF
2e620 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
2e630 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29  DATA|PTF_LEAF) )
2e640 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2e650 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c  New, PTF_INTKEY|
2e660 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
2e670 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65  _LEAF);.    asse
2e680 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31  mblePage(pNew, 1
2e690 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c  , &pCell, &szCel
2e6a0 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  l);..    /* If t
2e6b0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
2e6c0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
2e6d0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2e6e0 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
2e6f0 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
2e700 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
2e710 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
2e720 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
2e730 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
2e740 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2e750 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
2e760 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
2e770 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
2e780 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2e790 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
2e7a0 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
2e7b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
2e7c0 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
2e7d0 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
2e7e0 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
2e7f0 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
2e800 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
2e810 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2e820 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
2e830 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
2e840 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
2e850 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
2e860 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
2e870 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
2e880 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
2e890 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
2e8a0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
2e8b0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2e8c0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2e8d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2e8e0 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
2e8f0 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2e900 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
2e910 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
2e920 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
2e930 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
2e940 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43  OvflPtr(pNew, pC
2e950 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ell, &rc);.     
2e960 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
2e970 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69  /* Create a divi
2e980 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  der cell to inse
2e990 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  rt into pParent.
2e9a0 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   The divider cel
2e9b0 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74  l.    ** consist
2e9c0 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61  s of a 4-byte pa
2e9d0 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70  ge number (the p
2e9e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50  age number of pP
2e9f0 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20  age) and.    ** 
2ea00 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2ea10 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69  h key value (whi
2ea20 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ch must be the s
2ea30 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ame value as the
2ea40 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  .    ** largest 
2ea50 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20  key on pPage).. 
2ea60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20     **.    ** To 
2ea70 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
2ea80 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50   key value on pP
2ea90 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20  age, first find 
2eaa0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a  the right-most .
2eab0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2eac0 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20  Page. The first 
2ead0 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
2eae0 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20  is cell are the 
2eaf0 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c  .    ** record-l
2eb00 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c  ength (a variabl
2eb10 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2eb20 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73   at most 32-bits
2eb30 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a   in size).    **
2eb40 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c   and the key val
2eb50 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  ue (a variable l
2eb60 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d  ength integer, m
2eb70 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75  ay have any valu
2eb80 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  e)..    ** The f
2eb90 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c  irst of the whil
2eba0 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c  e(...) loops bel
2ebb0 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68  ow skips over th
2ebc0 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a  e record-length.
2ebd0 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68      ** field. Th
2ebe0 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e  e second while(.
2ebf0 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20  ..) loop copies 
2ec00 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72  the key value fr
2ec10 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65  om the.    ** ce
2ec20 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f  ll on pPage into
2ec30 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2ec40 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
2ec50 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2ec60 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
2ec70 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f  ell-1);.    pSto
2ec80 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2ec90 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65     while( (*(pCe
2eca0 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70  ll++)&0x80) && p
2ecb0 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20  Cell<pStop );.  
2ecc0 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2ecd0 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2ece0 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28  ((*(pOut++) = *(
2ecf0 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20  pCell++))&0x80) 
2ed00 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
2ed10 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
2ed20 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2ed30 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65   cell into pPare
2ed40 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72  nt. */.    inser
2ed50 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
2ed60 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70  Parent->nCell, p
2ed70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75  Space, (int)(pOu
2ed80 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20  t-pSpace),.     
2ed90 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61            0, pPa
2eda0 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ge->pgno, &rc);.
2edb0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
2edc0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
2edd0 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
2ede0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
2edf0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
2ee00 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
2ee10 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
2ee20 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
2ee30 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
2ee40 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2ee50 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
2ee60 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
2ee70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2ee80 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
2ee90 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
2eea0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
2eeb0 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
2eec0 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
2eed0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2eee0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
2eef0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
2ef00 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
2ef10 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
2ef20 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
2ef30 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
2ef40 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
2ef50 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
2ef60 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
2ef70 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2ef80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ef90 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
2efa0 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
2efb0 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
2efc0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
2efd0 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
2efe0 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
2eff0 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
2f000 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2f010 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
2f020 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2f030 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
2f040 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2f050 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
2f060 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
2f070 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
2f080 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2f090 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
2f0a0 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
2f0b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
2f0c0 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
2f0d0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2f0e0 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
2f0f0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
2f100 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
2f110 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
2f120 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
2f130 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
2f140 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
2f150 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
2f160 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f170 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2f180 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
2f190 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
2f1a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
2f1b0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2f1c0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
2f1d0 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
2f1e0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2f1f0 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2f200 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2f210 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2f220 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2f230 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
2f240 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
2f250 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f260 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
2f270 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f280 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2f290 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2f2a0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2f2b0 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
2f2c0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
2f2d0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
2f2e0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
2f2f0 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
2f300 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2f310 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
2f320 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
2f330 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
2f340 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
2f350 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
2f360 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
2f370 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2f380 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
2f390 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
2f3a0 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
2f3b0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2f3c0 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
2f3d0 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
2f3e0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
2f3f0 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
2f400 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
2f410 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
2f420 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
2f430 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
2f440 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
2f450 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
2f460 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
2f470 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
2f480 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
2f490 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
2f4a0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
2f4b0 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
2f4c0 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
2f4d0 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
2f4e0 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
2f4f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
2f500 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
2f510 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c 5b  * MemPage.aOvfl[
2f520 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61  ] array), they a
2f530 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f  re not copied to
2f540 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66   pTo. .**.** Bef
2f550 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70  ore returning, p
2f560 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69  age pTo is reini
2f570 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62  tialized using b
2f580 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a  treeInitPage()..
2f590 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72  **.** The perfor
2f5a0 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75  mance of this fu
2f5b0 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72  nction is not cr
2f5c0 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e  itical. It is on
2f5d0 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ly used by .** t
2f5e0 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c  he balance_shall
2f5f0 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e  ower() and balan
2f600 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63  ce_deeper() proc
2f610 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20  edures, neither 
2f620 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20  of.** which are 
2f630 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64  called often und
2f640 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d  er normal circum
2f650 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74  stances..*/.stat
2f660 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65  ic void copyNode
2f670 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20  Content(MemPage 
2f680 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20  *pFrom, MemPage 
2f690 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b  *pTo, int *pRC){
2f6a0 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2f6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f6c0 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
2f6d0 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
2f6e0 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73  t;.    u8 * cons
2f6f0 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
2f700 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a  >aData;.    u8 *
2f710 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f   const aTo = pTo
2f720 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74  ->aData;.    int
2f730 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20   const iFromHdr 
2f740 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73  = pFrom->hdrOffs
2f750 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73  et;.    int cons
2f760 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f  t iToHdr = ((pTo
2f770 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30  ->pgno==1) ? 100
2f780 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72   : 0);.    int r
2f790 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61  c;.    int iData
2f7a0 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65  ;.  .  .    asse
2f7b0 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69  rt( pFrom->isIni
2f7c0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
2f7d0 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69   pFrom->nFree>=i
2f7e0 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73  ToHdr );.    ass
2f7f0 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61  ert( get2byte(&a
2f800 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d  From[iFromHdr+5]
2f810 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  ) <= (int)pBt->u
2f820 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a  sableSize );.  .
2f830 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2f840 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74  b-tree node cont
2f850 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46  ent from page pF
2f860 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
2f870 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20   */.    iData = 
2f880 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b  get2byte(&aFrom[
2f890 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20  iFromHdr+5]);.  
2f8a0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44    memcpy(&aTo[iD
2f8b0 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61  ata], &aFrom[iDa
2f8c0 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  ta], pBt->usable
2f8d0 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20  Size-iData);.   
2f8e0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f   memcpy(&aTo[iTo
2f8f0 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72  Hdr], &aFrom[iFr
2f900 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63  omHdr], pFrom->c
2f910 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46  ellOffset + 2*pF
2f920 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a  rom->nCell);.  .
2f930 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c      /* Reinitial
2f940 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
2f950 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2f960 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
2f970 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
2f980 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2f990 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2f9a0 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2f9b0 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69  can actually fai
2f9c0 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66  l under.    ** f
2f9d0 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69  airly obscure ci
2f9e0 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65  rcumstances, eve
2f9f0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61  n though it is a
2fa00 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c   copy of initial
2fa10 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67  ized .    ** pag
2fa20 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a  e pFrom..    */.
2fa30 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20      pTo->isInit 
2fa40 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  = 0;.    rc = bt
2fa50 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29  reeInitPage(pTo)
2fa60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2fa70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fa80 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2fa90 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2faa0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
2fab0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2fac0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2fad0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2fae0 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20  -map entries.   
2faf0 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72   ** for any b-tr
2fb00 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  ee or overflow p
2fb10 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f  ages that pTo no
2fb20 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  w contains the p
2fb30 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20  ointers to..    
2fb40 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
2fb50 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2fb60 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64   *pRC = setChild
2fb70 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20  Ptrmaps(pTo);.  
2fb80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2fb90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
2fba0 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c  distributes cell
2fbb0 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74  s on the iParent
2fbc0 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20  Idx'th child of 
2fbd0 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65  pParent.** (here
2fbe0 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22  after "the page"
2fbf0 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69  ) and up to 2 si
2fc00 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61  blings so that a
2fc10 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
2fc20 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  out the.** same 
2fc30 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
2fc40 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20  pace. Usually a 
2fc50 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f  single sibling o
2fc60 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
2fc70 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65   the.** page are
2fc80 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
2fc90 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62  ancing, though b
2fca0 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67  oth siblings mig
2fcb0 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65  ht come from one
2fcc0 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20  .** side if the 
2fcd0 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73  page is the firs
2fce0 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  t or last child 
2fcf0 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49  of its parent. I
2fd00 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68  f the page .** h
2fd10 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20  as fewer than 2 
2fd20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68  siblings (someth
2fd30 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
2fd40 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2fd50 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f   page.** is a ro
2fd60 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69  ot page or a chi
2fd70 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67  ld of a root pag
2fd80 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  e) then all avai
2fd90 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a  lable siblings.*
2fda0 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  * participate in
2fdb0 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a   the balancing..
2fdc0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
2fdd0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20   of siblings of 
2fde0 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62  the page might b
2fdf0 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64  e increased or d
2fe00 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20  ecreased by .** 
2fe10 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e  one or two in an
2fe20 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
2fe30 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
2fe40 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
2fe50 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ull. .**.** Note
2fe60 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20   that when this 
2fe70 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2fe80 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63  d, some of the c
2fe90 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
2fea0 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
2feb0 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
2fec0 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74   in MemPage.aDat
2fed0 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61  a[]. This can ha
2fee0 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
2fef0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
2ff00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
2ff10 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63  sures that all c
2ff20 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  ells allocated.*
2ff30 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e  * to the page an
2ff40 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66  d its siblings f
2ff50 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e  it into MemPage.
2ff60 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72  aData[] before r
2ff70 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
2ff80 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66  In the course of
2ff90 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70   balancing the p
2ffa0 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c  age and its sibl
2ffb0 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20  ings, cells may 
2ffc0 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69  be.** inserted i
2ffd0 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66  nto or removed f
2ffe0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2fff0 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44  age (pParent). D
30000 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63  oing so.** may c
30010 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20  ause the parent 
30020 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f  page to become o
30030 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
30040 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a  full. If this.**
30050 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20   happens, it is 
30060 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
30070 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
30080 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63   to invoke the c
30090 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63  orrect.** balanc
300a0 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  ing routine to f
300b0 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ix this problem 
300c0 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65  (see the balance
300d0 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a  () routine). .**
300e0 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
300f0 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  ine fails for an
30100 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67  y reason, it mig
30110 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  ht leave the dat
30120 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f  abase.** in a co
30130 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53  rrupted state. S
30140 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
30150 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74  e fails, the dat
30160 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  abase should.** 
30170 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
30180 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20  **.** The third 
30190 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
301a0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c   function, aOvfl
301b0 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e  Space, is a poin
301c0 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66  ter to a.** buff
301d0 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  er big enough to
301e0 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20   hold one page. 
301f0 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69  If while inserti
30200 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  ng cells into th
30210 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65  e parent.** page
30220 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70   (pParent) the p
30230 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
30240 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69  es overfull, thi
30250 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75  s buffer is.** u
30260 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
30270 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c   parent's overfl
30280 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73  ow cells. Becaus
30290 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
302a0 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78  inserts.** a max
302b0 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76  imum of four div
302c0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20  ider cells into 
302d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
302e0 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d   and the maximum
302f0 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65  .** size of a ce
30300 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ll stored within
30310 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64   an internal nod
30320 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73  e is always less
30330 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20   than 1/4.** of 
30340 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74  the page-size, t
30350 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  he aOvflSpace[] 
30360 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e  buffer is guaran
30370 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65  teed to be large
30380 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61  .** enough for a
30390 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ll overflow cell
303a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66  s..**.** If aOvf
303b0 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f  lSpace is set to
303c0 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c   a null pointer,
303d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
303e0 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
303f0 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
30400 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e  ic int balance_n
30410 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67  onroot(.  MemPag
30420 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20  e *pParent,     
30430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
30440 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c  ent page of sibl
30450 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ings being balan
30460 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ced */.  int iPa
30470 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20  rentIdx,        
30480 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30490 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22 20  x of "the page" 
304a0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
304b0 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20  u8 *aOvflSpace, 
304c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304d0 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74  /* page-size byt
304e0 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
304f0 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20  parent ovfl */. 
30500 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20   int isRoot     
30510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30520 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 72   /* True if pPar
30530 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61  ent is a root-pa
30540 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  ge */.){.  BtSha
30550 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
30560 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77          /* The w
30570 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f  hole database */
30580 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30  .  int nCell = 0
30590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
305a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
305b0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
305c0 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c  /.  int nMaxCell
305d0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
305e0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
305f0 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a  ze of apCell, sz
30600 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a  Cell, aFrom. */.
30610 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20    int nNew = 0; 
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30630 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30640 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a  s in apNew[] */.
30650 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20    int nOld;     
30660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30670 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
30680 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  s in apOld[] */.
30690 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20    int i, j, k;  
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
306b0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
306c0 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306e0 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
306f0 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
30700 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
30710 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30720 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
30730 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
30740 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72  */.  u16 leafCor
30750 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
30760 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
30770 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
30780 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
30790 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
307a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
307b0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
307c0 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
307d0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
307e0 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
307f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
30800 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
30810 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
30820 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30840 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
30850 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
30860 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
30870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
30880 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
30890 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
308a0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
308b0 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
308c0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
308d0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
308e0 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
308f0 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30  t iOvflSpace = 0
30900 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
30910 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
30920 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20  of aOvflSpace[] 
30930 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74  */.  int szScrat
30940 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
30950 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72    /* Size of scr
30960 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75  atch memory requ
30970 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  ested */.  MemPa
30980 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20  ge *apOld[NB];  
30990 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
309a0 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73   and up to two s
309b0 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d  iblings */.  Mem
309c0 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d  Page *apCopy[NB]
309d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69  ;         /* Pri
309e0 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61  vate copies of a
309f0 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a  pOld[] pages */.
30a00 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77    MemPage *apNew
30a10 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f  [NB+2];        /
30a20 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
30a30 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66  o NB siblings af
30a40 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f  ter balancing */
30a50 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20  .  u8 *pRight;  
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70  /* Location in p
30a80 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73  arent of right-s
30a90 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a  ibling pointer *
30aa0 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42  /.  u8 *apDiv[NB
30ab0 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  -1];            
30ac0 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c   /* Divider cell
30ad0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a  s in pParent */.
30ae0 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b    int cntNew[NB+
30af0 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  2];            /
30b00 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c  * Index in aCell
30b10 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72  [] of cell after
30b20 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
30b30 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b  int szNew[NB+2];
30b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b50 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66  Combined size of
30b60 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20   cells place on 
30b70 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  i-th page */.  u
30b80 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20  8 **apCell = 0; 
30b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
30ba0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
30bb0 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
30bc0 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
30bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
30be0 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  al size of all c
30bf0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
30c00 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65   */.  u8 *aSpace
30c10 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
30c20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
30c30 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64 65  copies of divide
30c40 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67  rs cells */.  Pg
30c50 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
30c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
30c70 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20  mp var to store 
30c80 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  a page number in
30c90 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61   */..  pBt = pPa
30ca0 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73  rent->pBt;.  ass
30cb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
30cc0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
30cd0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
30ce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
30cf0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
30d00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23  ->pDbPage) );..#
30d10 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22 42  if 0.  TRACE(("B
30d20 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
30d30 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
30d40 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
30d50 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
30d60 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ));.#endif..  /*
30d70 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70   At this point p
30d80 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20  Parent may have 
30d90 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72  at most one over
30da0 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69  flow cell. And i
30db0 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72  f.  ** this over
30dc0 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65  flow cell is pre
30dd0 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sent, it must be
30de0 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a   the cell with .
30df0 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65    ** index iPare
30e00 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e  ntIdx. This scen
30e10 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74  ario comes about
30e20 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
30e30 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ion.  ** is call
30e40 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20  ed (indirectly) 
30e50 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65  from sqlite3Btre
30e60 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a  eDelete()..  */.
30e70 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
30e80 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
30e90 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  || pParent->nOve
30ea0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73  rflow==1 );.  as
30eb0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
30ec0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
30ed0 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d  Parent->aOvfl[0]
30ee0 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78  .idx==iParentIdx
30ef0 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66   );..  if( !aOvf
30f00 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65  lSpace ){.    re
30f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30f20 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  M;.  }..  /* Fin
30f30 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  d the sibling pa
30f40 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20  ges to balance. 
30f50 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  Also locate the 
30f60 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
30f70 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69   .  ** that divi
30f80 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  de the siblings.
30f90 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
30fa0 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
30fb0 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a  iblings on .  **
30fc0 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
30fd0 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c  pPage. More sibl
30fe0 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
30ff0 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
31000 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20  wever, .  ** if 
31010 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72 20  there are fewer 
31020 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73  than NN siblings
31030 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69   on the other si
31040 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20  de. If pParent. 
31050 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65   ** has NB or fe
31060 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65  wer children the
31070 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  n all children o
31080 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61  f pParent are ta
31090 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ken.  .  **.  **
310a0 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
310b0 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64 65  drops the divide
310c0 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65  r cells from the
310d0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68   parent page. Th
310e0 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65  is.  ** way, the
310f0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
31100 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
31110 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c  not have to deal
31120 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f   with any.  ** o
31130 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e  verflow cells in
31140 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31150 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65  , since if any e
31160 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c  xisted they will
31170 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61  .  ** have alrea
31180 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e  dy been removed.
31190 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72  .  */.  i = pPar
311a0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b  ent->nOverflow +
311b0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
311c0 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20  .  if( i<2 ){.  
311d0 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
311e0 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d   nOld = i+1;.  }
311f0 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d  else{.    nOld =
31200 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72   3;.    if( iPar
31210 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20  entIdx==0 ){    
31220 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
31230 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
31240 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61     }else if( iPa
31250 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20  rentIdx==i ){.  
31260 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b      nxDiv = i-2;
31270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31280 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e    nxDiv = iParen
31290 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tIdx-1;.    }.  
312a0 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69    i = 2;.  }.  i
312b0 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72  f( (i+nxDiv-pPar
312c0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d  ent->nOverflow)=
312d0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
312e0 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20  ){.    pRight = 
312f0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
31300 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
31310 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  et+8];.  }else{.
31320 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e      pRight = fin
31330 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
31340 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
31350 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a  nOverflow);.  }.
31360 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31370 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69  e(pRight);.  whi
31380 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20  le( 1 ){.    rc 
31390 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
313a0 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f  (pBt, pgno, &apO
313b0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
313c0 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  rc ){.      mems
313d0 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b  et(apOld, 0, (i+
313e0 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  1)*sizeof(MemPag
313f0 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e*));.      goto
31400 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
31420 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
31430 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
31440 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
31450 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30      if( (i--)==0
31460 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69   ) break;..    i
31470 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72  f( i+nxDiv==pPar
31480 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  ent->aOvfl[0].id
31490 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f  x && pParent->nO
314a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
314b0 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72   apDiv[i] = pPar
314c0 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43  ent->aOvfl[0].pC
314d0 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20  ell;.      pgno 
314e0 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76  = get4byte(apDiv
314f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  [i]);.      szNe
31500 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  w[i] = cellSizeP
31510 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
31520 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61  v[i]);.      pPa
31530 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
31540 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
31550 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
31560 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
31570 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
31580 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
31590 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74        pgno = get
315a0 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b  4byte(apDiv[i]);
315b0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20  .      szNew[i] 
315c0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
315d0 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29  arent, apDiv[i])
315e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70  ;..      /* Drop
315f0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74   the cell from t
31600 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20  he parent page. 
31610 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70  apDiv[i] still p
31620 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a  oints to.      *
31630 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69  * the cell withi
31640 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76  n the parent, ev
31650 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73  en though it has
31660 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20   been dropped.. 
31670 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
31680 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f  safe because dro
31690 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c  pping a cell onl
316a0 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  y overwrites the
316b0 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20   first.      ** 
316c0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74  four bytes of it
316d0 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  , and this funct
316e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
316f0 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  d the first.    
31700 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20    ** four bytes 
31710 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
31720 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e  ell. So the poin
31730 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75  ter is safe to u
31740 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65  se.      ** late
31750 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a  r on.  .      **
31760 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
31770 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
31780 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65  led in secure-de
31790 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68  lete mode. In th
317a0 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a  is case,.      *
317b0 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29  * the dropCell()
317c0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76   routine will ov
317d0 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69  erwrite the enti
317e0 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72  re cell with zer
317f0 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  oes..      ** In
31800 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70   this case, temp
31810 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65  orarily copy the
31820 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61   cell into the a
31830 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20  OvflSpace[].    
31840 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20    ** buffer. It 
31850 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f  will be copied o
31860 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e  ut again as soon
31870 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d   as the aSpace[]
31880 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a   buffer.      **
31890 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   is allocated.  
318a0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
318b0 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
318c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
318d0 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  ff = SQLITE_PTR_
318e0 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29  TO_INT(apDiv[i])
318f0 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   - SQLITE_PTR_TO
31900 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44  _INT(pParent->aD
31910 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ata);.        if
31920 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d  ( (iOff+szNew[i]
31930 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  )>(int)pBt->usab
31940 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
31950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31960 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31970 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
31980 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
31990 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
319a0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
319b0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
319c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
319d0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
319e0 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  y(&aOvflSpace[iO
319f0 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  ff], apDiv[i], s
31a00 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zNew[i]);.      
31a10 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
31a20 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
31a30 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
31a40 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta];.        }. 
31a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f       }.      dro
31a60 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  pCell(pParent, i
31a70 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
31a80 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77  nOverflow, szNew
31a90 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  [i], &rc);.    }
31aa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
31ab0 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
31ac0 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
31ad0 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
31ae0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
31af0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
31b00 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
31b10 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
31b20 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
31b30 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
31b40 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
31b50 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
31b60 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
31b70 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
31b80 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
31b90 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
31ba0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31bc0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
31bd0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
31be0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31c00 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
31c10 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31c40 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
31c50 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
31c90 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
31ca0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
31cb0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
31cc0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
31cd0 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
31ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
31cf0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
31d00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
31d10 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
31d20 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
31d30 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
31d40 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
31d50 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
31d60 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
31d70 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
31d80 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
31d90 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
31da0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
31db0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
31dc0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
31dd0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
31de0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
31df0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
31e00 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
31e10 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
31e20 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
31e30 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
31e40 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
31e50 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
31e60 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
31e70 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
31e80 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
31e90 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
31ea0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
31eb0 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
31ec0 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
31ed0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
31ee0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
31ef0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
31f00 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
31f10 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
31f20 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
31f30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
31f40 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
31f50 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
31f60 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
31f70 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
31f80 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
31f90 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
31fa0 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
31fb0 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
31fc0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
31fd0 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
31fe0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
31ff0 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
32000 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
32010 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
32020 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
32030 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
32040 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
32050 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
32060 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
32070 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
32080 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72  ..  */.  leafCor
32090 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b  rection = apOld[
320a0 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  0]->leaf*4;.  le
320b0 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30  afData = apOld[0
320c0 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  ]->hasData;.  fo
320d0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
320e0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  ++){.    int lim
320f0 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  it;.    .    /* 
32100 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
32110 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65  thing else, take
32120 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
32130 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62  'th original sib
32140 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20  ling.    ** The 
32150 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
32160 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
32170 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
32180 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a  ies rather.    *
32190 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
321a0 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
321b0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
321c0 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
321d0 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
321e0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
321f0 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d  itten.  */.    M
32200 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
32210 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
32220 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42  age*)&aSpace1[pB
32230 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a  t->pageSize + k*
32240 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
32250 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  Old, apOld[i], s
32260 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
32270 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61  .    pOld->aData
32280 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b   = (void*)&pOld[
32290 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
322a0 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  Old->aData, apOl
322b0 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
322c0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
322d0 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e    limit = pOld->
322e0 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
322f0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70  rflow;.    if( p
32300 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  Old->nOverflow>0
32310 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   ){.      for(j=
32320 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
32330 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32340 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
32350 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
32360 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
32370 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f  dOverflowCell(pO
32380 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  ld, j);.        
32390 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
323a0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
323b0 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
323c0 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ;.        nCell+
323d0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
323e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a  else{.      u8 *
323f0 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44  aData = pOld->aD
32400 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d  ata;.      u16 m
32410 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e  askPage = pOld->
32420 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20  maskPage;.      
32430 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  u16 cellOffset =
32440 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65   pOld->cellOffse
32450 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  t;.      for(j=0
32460 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
32470 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32480 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
32490 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
324a0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
324b0 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61  Cellv2(aData, ma
324c0 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73  skPage, cellOffs
324d0 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20  et, j);.        
324e0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
324f0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64  cellSizePtr(pOld
32500 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29  , apCell[nCell])
32510 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b  ;.        nCell+
32520 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
32530 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20         .    if( 
32540 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61  i<nOld-1 && !lea
32550 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31  fData){.      u1
32560 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65  6 sz = (u16)szNe
32570 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a  w[i];.      u8 *
32580 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73  pTemp;.      ass
32590 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
325a0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a  ells );.      sz
325b0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
325c0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
325d0 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31  &aSpace1[iSpace1
325e0 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31  ];.      iSpace1
325f0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73   += sz;.      as
32600 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d  sert( sz<=pBt->m
32610 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20  axLocal+23 );.  
32620 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
32630 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  ce1 <= (int)pBt-
32640 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
32650 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
32660 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a   apDiv[i], sz);.
32670 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32680 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66  ll] = pTemp+leaf
32690 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
326a0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
326b0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c  rrection==0 || l
326c0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
326d0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
326e0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c  [nCell] = szCell
326f0 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f  [nCell] - leafCo
32700 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
32710 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20  if( !pOld->leaf 
32720 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32730 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
32740 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
32750 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64  assert( pOld->hd
32760 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20  rOffset==0 );.  
32770 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
32780 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht pointer of th
32790 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c  e child page pOl
327a0 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65  d becomes the le
327b0 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  ft.        ** po
327c0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76  inter of the div
327d0 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20  ider cell */.   
327e0 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65       memcpy(apCe
327f0 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64  ll[nCell], &pOld
32800 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a  ->aData[8], 4);.
32810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32820 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32830 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
32840 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
32850 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
32860 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  .          /* Do
32870 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63   not allow any c
32880 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  ells smaller tha
32890 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  n 4 bytes. */.  
328a0 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
328b0 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20  Cell] = 4;.     
328c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
328d0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
328e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
328f0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
32900 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
32910 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
32920 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a  ll nCell cells..
32930 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20    ** Store this 
32940 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20  number in "k".  
32950 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e  Also compute szN
32960 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
32970 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a  e total.  ** siz
32980 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  e of all cells o
32990 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20  n the i-th page 
329a0 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69  and cntNew[] whi
329b0 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a  ch is the index.
329c0 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d    ** in apCell[]
329d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
329e0 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69  t divides page i
329f0 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20   from page i+1. 
32a00 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d   .  ** cntNew[k]
32a10 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43   should equal nC
32a20 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56  ell..  **.  ** V
32a30 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62  alues computed b
32a40 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20  y this block:.  
32a50 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
32a60 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e    k: The total n
32a70 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
32a80 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73   pages.  **    s
32a90 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20  zNew[i]: Spaced 
32aa0 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68  used on the i-th
32ab0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20   sibling page.. 
32ac0 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a   **   cntNew[i]:
32ad0 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c   Index in apCell
32ae0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
32af0 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65  for the first ce
32b00 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20  ll to.  **      
32b10 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68          the righ
32b20 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69  t of the i-th si
32b30 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
32b40 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75   usableSpace: Nu
32b50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
32b60 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
32b70 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67   on each sibling
32b80 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75  ..  ** .  */.  u
32b90 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74  sableSpace = pBt
32ba0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31  ->usableSize - 1
32bb0 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  2 + leafCorrecti
32bc0 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74  on;.  for(subtot
32bd0 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c  al=k=i=0; i<nCel
32be0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  l; i++){.    ass
32bf0 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73  ert( i<nMaxCells
32c00 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c   );.    subtotal
32c10 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20   += szCell[i] + 
32c20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f  2;.    if( subto
32c30 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63  tal > usableSpac
32c40 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77  e ){.      szNew
32c50 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d  [k] = subtotal -
32c60 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   szCell[i];.    
32c70 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b    cntNew[k] = i;
32c80 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44  .      if( leafD
32c90 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ata ){ i--; }.  
32ca0 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30      subtotal = 0
32cb0 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20  ;.      k++;.   
32cc0 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b     if( k>NB+1 ){
32cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
32ce0 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20  RUPT_BKPT; goto 
32cf0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
32d00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
32d10 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
32d20 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
32d30 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
32d40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
32d50 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
32d60 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
32d70 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
32d80 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
32d90 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
32da0 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
32db0 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
32dc0 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
32dd0 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
32de0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
32df0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
32e00 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
32e10 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
32e20 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
32e30 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
32e40 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
32e50 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
32e60 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
32e70 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
32e80 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
32e90 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
32ea0 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
32eb0 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
32ec0 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
32ed0 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
32ee0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
32ef0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
32f00 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
32f10 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
32f20 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
32f30 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
32f40 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
32f50 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
32f60 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
32f70 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
32f80 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
32f90 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
32fa0 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
32fb0 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
32fc0 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
32fd0 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
32fe0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
32ff0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
33000 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33010 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
33020 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
33030 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
33040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33050 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
33060 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
33070 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
33080 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
33090 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
330a0 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
330b0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
330c0 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
330d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
330e0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
330f0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
33100 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
33110 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
33120 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
33130 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
33140 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
33150 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
33160 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
33170 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
33180 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
33190 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
331a0 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
331b0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
331c0 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
331d0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
331e0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
331f0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
33200 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
33210 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
33220 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
33230 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20  r pPage is.  ** 
33240 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
33250 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
33260 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
33270 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
33280 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
33290 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
332a0 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
332b0 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
332c0 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
332d0 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
332e0 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
332f0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
33300 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  ) );..  TRACE(("
33310 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
33320 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
33330 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
33340 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
33350 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
33360 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
33370 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
33380 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
33390 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
333a0 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
333b0 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
333c0 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
333d0 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
333e0 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
333f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
33400 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
33410 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33420 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
33430 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
33440 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
33450 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
33460 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
33470 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
33480 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
33490 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
334a0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
334b0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
334c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
334d0 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
334e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
334f0 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
33500 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
33510 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
33520 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
33530 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
33540 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
33550 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
33560 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
33570 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
33580 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
33590 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
335a0 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
335b0 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
335c0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
335d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
335e0 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
335f0 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
33600 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
33610 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
33620 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
33630 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
33640 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
33650 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
33660 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33680 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
33690 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
336a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
336b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
336c0 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
336d0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
336e0 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
336f0 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
33700 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
33710 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
33720 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
33730 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
33740 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
33750 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
33760 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
33770 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
33780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
33790 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
337a0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
337b0 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
337c0 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
337d0 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
337e0 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
337f0 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
33800 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
33810 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
33820 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
33830 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
33840 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
33850 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
33860 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
33870 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
33880 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
33890 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
338a0 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
338b0 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
338c0 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
338d0 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
338e0 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
338f0 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
33900 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
33910 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
33920 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
33930 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
33940 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
33950 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
33960 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
33970 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
33980 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
33990 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
339a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
339b0 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
339c0 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
339d0 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
339e0 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
339f0 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
33a00 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
33a10 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
33a20 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
33a30 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
33a40 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
33a50 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
33a60 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
33a70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
33a80 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
33a90 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
33aa0 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
33ab0 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
33ac0 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
33ad0 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
33ae0 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
33af0 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
33b00 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
33b10 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
33b20 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
33b30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
33b40 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
33b50 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
33b60 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
33b70 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
33b80 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
33b90 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
33ba0 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
33bb0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
33bc0 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
33bd0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
33be0 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
33bf0 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
33c00 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
33c10 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
33c20 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
33c30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
33c40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
33c50 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
33c60 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
33c70 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
33c80 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
33c90 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
33ca0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
33cb0 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
33cc0 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
33cd0 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
33ce0 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
33cf0 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
33d00 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
33d10 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
33d20 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
33d30 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
33d40 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
33d50 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
33d60 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
33d70 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
33d80 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
33d90 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
33da0 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
33db0 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
33dc0 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
33dd0 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
33de0 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
33df0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
33e00 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
33e10 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
33e20 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
33e30 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
33e40 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
33e50 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
33e60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
33e70 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
33e80 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
33e90 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
33ea0 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
33eb0 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
33ec0 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
33ed0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
33ee0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
33ef0 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
33f00 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
33f10 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
33f20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
33f30 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
33f40 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
33f50 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
33f60 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
33f70 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
33f80 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
33f90 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
33fa0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
33fb0 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
33fc0 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
33fd0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
33fe0 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
33ff0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
34000 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
34010 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
34020 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
34030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
34040 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
34050 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
34060 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
34070 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
34080 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
34090 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
340a0 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
340b0 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
340c0 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
340d0 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
340e0 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
340f0 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
34100 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
34110 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
34120 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
34130 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
34140 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34150 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
34160 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
34170 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
34180 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
34190 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
341a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
341b0 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
341c0 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
341d0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
341e0 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
341f0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
34200 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34210 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
34220 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
34230 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
34240 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
34250 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
34260 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
34270 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
34280 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
34290 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
342a0 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
342b0 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
342c0 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
342d0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
342e0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
342f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
34300 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
34310 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
34320 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
34330 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
34340 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
34350 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
34360 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
34370 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
34380 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
34390 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
343a0 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
343b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
343c0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
343d0 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
343e0 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
343f0 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
34400 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
34410 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
34420 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
34430 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
34440 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
34450 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
34460 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
34470 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
34480 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
34490 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
344a0 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
344b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
344c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
344d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
344e0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
344f0 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
34500 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34510 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
34520 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
34530 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
34540 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
34550 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
34560 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
34570 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
34580 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
34590 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
345a0 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
345b0 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
345c0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
345d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
345e0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
345f0 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
34600 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34610 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34620 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
34630 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
34640 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
34650 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
34660 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
34670 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
34680 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
34690 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
346a0 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
346b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
346c0 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
346d0 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
346e0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
346f0 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
34700 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
34710 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
34720 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
34730 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
34740 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
34750 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
34760 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
34770 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
34780 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
34790 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
347a0 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
347b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
347c0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
347d0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
347e0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
347f0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
34800 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
34810 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
34820 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
34830 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
34840 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
34850 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
34860 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
34870 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
34880 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
34890 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
348a0 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
348b0 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
348c0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
348d0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
348e0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
348f0 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
34900 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
34910 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
34920 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
34930 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
34940 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
34950 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
34960 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
34970 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
34980 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
34990 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
349a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
349b0 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
349c0 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
349d0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
349e0 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
349f0 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
34a00 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
34a10 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
34a20 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
34a30 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
34a40 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
34a50 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
34a60 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
34a70 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
34a80 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
34a90 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
34aa0 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
34ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
34ac0 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
34ad0 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
34ae0 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
34af0 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
34b00 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
34b10 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
34b20 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
34b30 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
34b40 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
34b50 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
34b60 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
34b70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
34b80 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
34b90 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
34ba0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
34bb0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
34bc0 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
34bd0 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
34be0 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
34bf0 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
34c00 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
34c10 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
34c20 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
34c30 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
34c40 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
34c50 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
34c60 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
34c70 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
34c80 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
34c90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
34ca0 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
34cb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
34cc0 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
34cd0 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
34ce0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
34cf0 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
34d00 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
34d10 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
34d20 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
34d30 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
34d40 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
34d50 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
34d60 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
34d70 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
34d80 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
34d90 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
34da0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
34db0 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
34dc0 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
34dd0 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
34de0 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
34df0 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
34e00 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
34e10 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
34e20 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
34e30 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
34e40 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
34e50 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
34e60 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
34e70 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
34e80 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
34e90 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
34ea0 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
34eb0 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
34ec0 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
34ed0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
34ee0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
34ef0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
34f00 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
34f10 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
34f20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
34f30 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
34f40 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
34f50 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
34f60 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
34f70 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
34f80 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
34f90 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
34fa0 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
34fb0 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
34fc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
34fd0 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
34fe0 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
34ff0 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
35000 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
35010 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
35020 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
35030 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
35040 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
35050 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
35060 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35070 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35080 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
35090 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
350a0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
350b0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
350c0 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
350d0 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
350e0 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
350f0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
35100 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
35110 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
35120 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
35130 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
35140 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
35150 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
35160 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
35170 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
35180 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
35190 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
351a0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
351b0 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
351c0 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
351d0 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
351e0 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
351f0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
35200 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
35210 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
35220 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
35230 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
35240 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
35250 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
35260 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
35270 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
35280 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
35290 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
352a0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
352b0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
352c0 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
352d0 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
352e0 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
352f0 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
35300 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35310 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
35320 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
35330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35340 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
35350 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
35360 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
35370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
35390 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
353a0 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
353b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
353c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
353d0 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
353e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
353f0 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
35400 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
35410 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
35420 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
35430 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
35440 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
35450 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
35460 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
35470 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
35480 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
35490 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
354a0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
354b0 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
354c0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
354d0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
354e0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
354f0 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
35500 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
35510 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
35520 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
35530 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
35540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
35550 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
35560 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
35570 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
35580 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
35590 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
355a0 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
355b0 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
355c0 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
355d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
355e0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
355f0 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
35600 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
35610 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
35620 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
35630 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
35640 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
35650 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
35660 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
35670 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
35680 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
35690 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
356a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
356b0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
356c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
356d0 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
356e0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
356f0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
35700 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
35710 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
35720 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
35730 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
35740 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
35750 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
35760 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
35770 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
35780 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
35790 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
357a0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
357b0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
357c0 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
357d0 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
357e0 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
357f0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
35800 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
35810 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
35820 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35830 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
35840 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
35850 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
35860 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
35870 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
35880 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
35890 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
358a0 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
358b0 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
358c0 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
358d0 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
358e0 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
358f0 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
35900 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
35910 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
35920 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
35930 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
35940 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
35950 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
35960 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
35970 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
35980 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
35990 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
359a0 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
359b0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
359c0 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
359d0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
359e0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
359f0 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69 5d  t4byte(apCell[i]
35a00 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  ), PTRMAP_BTREE,
35a10 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63   pNew->pgno, &rc
35a20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35a30 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
35a40 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
35a50 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
35a60 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
35a70 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  pNew, apCell[i],
35a80 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
35a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35aa0 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
35ab0 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
35ac0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
35ad0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
35ae0 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62 79  u32 key = get4by
35af0 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44  te(&apNew[i]->aD
35b00 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
35b10 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
35b20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  key, PTRMAP_BTRE
35b30 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e  E, apNew[i]->pgn
35b40 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  o, &rc);.      }
35b50 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
35b60 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
35b70 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
35b80 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
35b90 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
35ba0 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
35bb0 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
35bc0 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
35bd0 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
35be0 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
35bf0 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
35c00 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
35c10 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
35c20 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
35c30 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
35c40 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
35c50 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
35c60 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
35c70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
35c80 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
35c90 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
35ca0 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
35cb0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
35cc0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
35cd0 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
35ce0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
35cf0 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
35d00 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
35d10 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
35d20 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
35d30 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
35d40 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
35d50 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
35d60 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
35d70 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
35d80 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
35d90 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
35da0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
35db0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
35dc0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
35dd0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
35de0 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
35df0 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
35e00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
35e10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
35e20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
35e30 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
35e40 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
35e50 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
35e60 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
35e70 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
35e80 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
35e90 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
35ea0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
35eb0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
35ec0 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
35ed0 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
35ee0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
35ef0 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
35f00 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
35f10 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
35f20 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
35f30 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
35f40 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
35f50 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
35f60 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
35f70 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
35f80 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
35f90 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
35fa0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
35fb0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
35fc0 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
35fd0 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
35fe0 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
35ff0 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
36000 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
36010 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
36020 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
36030 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
36040 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
36050 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
36060 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
36070 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
36080 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
36090 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
360a0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
360b0 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
360c0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
360d0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
360e0 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
360f0 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
36100 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
36110 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
36120 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
36130 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
36140 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
36150 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
36160 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
36170 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
36180 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
36190 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
361a0 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
361b0 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
361c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
361d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
361e0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
361f0 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
36200 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
36210 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
36220 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
36230 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
36240 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
36250 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20  oChild = 0;     
36260 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
36270 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
36280 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
36290 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
362a0 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
362b0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
362c0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
362d0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
362e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
362f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
36300 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
36310 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
36320 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
36330 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
36340 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
36350 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
36360 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
36370 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
36380 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
36390 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
363a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
363b0 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
363c0 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
363d0 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
363e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
363f0 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
36400 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
36410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36420 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
36430 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36440 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68 69  &pChild,&pgnoChi
36450 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30  ld,pRoot->pgno,0
36460 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
36470 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43  ontent(pRoot, pC
36480 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20 20  hild, &rc);.    
36490 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
364a0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
364b0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68 69  Put(pBt, pgnoChi
364c0 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ld, PTRMAP_BTREE
364d0 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26  , pRoot->pgno, &
364e0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
364f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
36500 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  ppChild = 0;.   
36510 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
36520 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
36530 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
36540 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
36550 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
36560 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
36570 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36580 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36590 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
365a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
365b0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f  hild->nCell==pRo
365c0 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ot->nCell );..  
365d0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
365e0 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
365f0 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d  to %d\n", pRoot-
36600 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
36610 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  gno));..  /* Cop
36620 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  y the overflow c
36630 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20  ells from pRoot 
36640 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d  to pChild */.  m
36650 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
36660 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66  vfl, pRoot->aOvf
36670 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  l, pRoot->nOverf
36680 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
36690 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
366a0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
366b0 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  w = pRoot->nOver
366c0 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  flow;..  /* Zero
366d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
366e0 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73   pRoot. Then ins
366f0 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74  tall pChild as t
36700 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20  he right-child. 
36710 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  */.  zeroPage(pR
36720 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  oot, pChild->aDa
36730 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
36740 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
36750 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
36760 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
36770 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20  , pgnoChild);.. 
36780 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69   *ppChild = pChi
36790 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ld;.  return SQL
367a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
367b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
367c0 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
367d0 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
367e0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
367f0 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
36800 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
36810 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
36820 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
36830 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
36840 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
36850 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
36860 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
36870 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
36880 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c  .** routine. Bal
36890 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  ancing routines 
368a0 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c  are:.**.**   bal
368b0 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20  ance_quick().** 
368c0 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
368d0 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
368e0 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61  nonroot().*/.sta
368f0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
36900 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
36910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36920 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69  TE_OK;.  const i
36930 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e  nt nMin = pCur->
36940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36950 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42  * 2 / 3;.  u8 aB
36960 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
36970 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65  [13];.  u8 *pFre
36980 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e  e = 0;..  TESTON
36990 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
369a0 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30  quick_called = 0
369b0 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   );.  TESTONLY( 
369c0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
369d0 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  er_called = 0 );
369e0 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74  ..  do {.    int
369f0 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
36a00 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  Page;.    MemPag
36a10 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
36a20 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a  >apPage[iPage];.
36a30 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d  .    if( iPage==
36a40 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
36a50 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
36a60 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
36a70 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
36a80 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65  he b-tree is ove
36a90 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  rfull. In this c
36aa0 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20  ase call the.   
36ab0 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
36ac0 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f  deeper() functio
36ad0 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  n to create a ne
36ae0 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20  w child for the 
36af0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
36b00 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68    ** and copy th
36b10 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
36b20 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ts of the root-p
36b30 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20  age to it. The. 
36b40 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69         ** next i
36b50 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
36b60 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
36b70 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70  ance the child p
36b80 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20  age..        */ 
36b90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36ba0 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
36bb0 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
36bc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
36bd0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
36be0 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ge, &pCur->apPag
36bf0 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e[1]);.        i
36c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
36c20 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20  ur->iPage = 1;. 
36c30 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
36c40 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
36c50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
36c60 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[1] = 0;.     
36c70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
36c80 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f  r->apPage[1]->nO
36c90 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20  verflow );.     
36ca0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
36cb0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
36cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36cd0 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  se if( pPage->nO
36ce0 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
36cf0 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e  age->nFree<=nMin
36d00 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
36d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36d20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73    MemPage * cons
36d30 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72  t pParent = pCur
36d40 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31  ->apPage[iPage-1
36d50 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  ];.      int con
36d60 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e  st iIdx = pCur->
36d70 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a  aiIdx[iPage-1];.
36d80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36d90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36da0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
36db0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
36dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e  QLITE_OK ){.#ifn
36dd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36de0 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20  QUICKBALANCE.   
36df0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
36e00 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20  hasData.        
36e10 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
36e20 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20  flow==1.        
36e30 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   && pPage->aOvfl
36e40 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
36e50 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
36e60 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
36e70 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
36e80 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
36e90 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
36ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
36eb0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
36ec0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
36ed0 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
36ee0 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
36ef0 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
36f00 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
36f10 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
36f20 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
36f30 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
36f40 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
36f50 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
36f60 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
36f70 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
36f80 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
36f90 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
36fa0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
36fb0 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
36fc0 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
36fd0 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
36fe0 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
36ff0 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
37000 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
37010 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
37020 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
37030 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
37040 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
37050 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
37060 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
37070 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
37080 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
37090 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
370a0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
370b0 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
370c0 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
370d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
370e0 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
370f0 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
37100 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
37110 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
37120 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
37130 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
37140 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73  ot verified, a s
37150 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76  ubtle bug involv
37160 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20  ing reuse.      
37170 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42      ** of the aB
37180 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
37190 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  [] might sneak i
371a0 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
371b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
371c0 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ( (balance_quick
371d0 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
371e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
371f0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
37200 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42  arent, pPage, aB
37210 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
37220 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
37230 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
37240 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
37250 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c  n this case, cal
37260 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  l balance_nonroo
37270 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62  t() to redistrib
37280 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20  ute cells.      
37290 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70      ** between p
372a0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32  Page and up to 2
372b0 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20   of its sibling 
372c0 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f  pages. This invo
372d0 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lves.          *
372e0 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  * modifying the 
372f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72  contents of pPar
37300 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
37310 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a  ause pParent to.
37320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
37330 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
37340 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e  underfull. The n
37350 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
37360 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20   the do-loop.   
37370 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
37380 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
37390 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63  t page to correc
373a0 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  t this..        
373b0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
373c0 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
373d0 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
373e0 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72  erfull, the over
373f0 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c  flow cell or cel
37400 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
37410 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
37420 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
37430 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
37440 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20  ately below. .  
37450 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62          ** A sub
37460 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
37470 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
37480 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20   will deal with 
37490 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
374a0 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c    ** calling bal
374b0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28  ance_nonroot() (
374c0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
374d0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
374e0 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  irst,.          
374f0 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27  ** but it doesn'
37500 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72  t deal with over
37510 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73  flow cells - jus
37520 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20  t moves them to 
37530 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  a.          ** d
37540 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20  ifferent page). 
37550 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71  Once this subseq
37560 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c  uent call to bal
37570 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a  ance_nonroot() .
37580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
37590 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69   completed, it i
375a0 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73  s safe to releas
375b0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
375c0 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20  fer used by.    
375d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
375e0 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74  vious call, as t
375f0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37600 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20   data will have 
37610 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  been .          
37620 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72  ** copied either
37630 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
37640 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
37650 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65  e or into the ne
37660 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  w.          ** p
37670 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73  Space buffer pas
37680 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65  sed to the latte
37690 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  r call to balanc
376a0 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20  e_nonroot()..   
376b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
376c0 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
376d0 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
376e0 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  oc(pCur->pBt->pa
376f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
37700 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
37710 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c  nonroot(pParent,
37720 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69   iIdx, pSpace, i
37730 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20  Page==1);.      
37740 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
37750 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
37760 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
37770 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
37780 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
37790 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
377a0 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
377b0 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
377c0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
377d0 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
377e0 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
377f0 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
37800 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
37810 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
37820 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
37830 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
37840 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
37850 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
37860 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
37870 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
37880 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
37890 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
378a0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
378b0 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
378c0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
378d0 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
378e0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
378f0 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
37900 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
37910 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
37920 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
37930 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
37940 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
37950 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
37960 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
37970 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
37980 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
37990 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
379a0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
379b0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
379c0 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
379d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
379e0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
379f0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
37a00 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
37a10 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
37a20 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
37a30 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
37a40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
37a50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
37a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37a70 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  .}.../*.** Inser
37a80 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
37a90 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
37aa0 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
37ab0 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
37ac0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
37ad0 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
37ae0 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
37af0 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
37b00 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
37b10 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
37b20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
37b30 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
37b40 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
37b50 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
37b60 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
37b70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
37b80 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
37b90 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
37ba0 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
37bb0 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
37bc0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
37bd0 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
37be0 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
37bf0 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
37c00 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  h ignored..**.**
37c10 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
37c20 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
37c30 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
37c40 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
37c50 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e 70   to.** MovetoUnp
37c60 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b 20  acked() to seek 
37c70 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20 28  cursor pCur to (
37c80 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73 20  pKey, nKey) has 
37c90 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
37ca0 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b 52  performed. seekR
37cb0 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65 61  esult is the sea
37cc0 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75 72  rch result retur
37cd0 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65 0a  ned (a negative.
37ce0 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43 75  ** number if pCu
37cf0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65  r points at an e
37d00 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d 61  ntry that is sma
37d10 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79 2c  ller than (pKey,
37d20 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61 20   nKey), or.** a 
37d30 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
37d40 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  f pCur points at
37d50 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69 73   an etry that is
37d60 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a 2a   larger than .**
37d70 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e 20   (pKey, nKey)). 
37d80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
37d90 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74  ekResult paramet
37da0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
37db0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
37dc0 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a  guarantees that.
37dd0 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  ** cursor pCur i
37de0 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  s pointing at th
37df0 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79 20  e existing copy 
37e00 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69 73  of a row that is
37e10 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77 72   to be.** overwr
37e20 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20 73  itten.  If the s
37e30 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
37e40 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20 63  ter is 0, then c
37e50 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a 2a  ursor pCur may.*
37e60 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 65  * point to any e
37e70 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65 6e  ntry or to no en
37e80 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20 73  try at all and s
37e90 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
37ea0 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
37eb0 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
37ec0 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
37ed0 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
37ee0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
37ef0 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
37f00 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
37f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
37f20 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
37f30 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
37f40 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
37f50 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
37f60 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
37f70 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
37f80 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
37f90 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
37fa0 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
37fb0 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
37fc0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
37fd0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
37fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37ff0 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
38000 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
38010 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
38020 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
38030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38040 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
38050 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
38060 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
38070 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
38080 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
38090 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74 6f   of prior Moveto
380a0 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c 20  Unpacked() call 
380b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
380c0 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b    int loc = seek
380d0 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20  Result;         
380e0 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20 64   /* -1: before d
380f0 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e 20  esired location 
38100 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20 20   +1: after */.  
38110 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a 20  int szNew = 0;. 
38120 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
38130 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
38140 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
38150 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
38160 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
38170 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
38180 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
38190 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
381a0 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ell = 0;..  if( 
381b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
381c0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
381d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
381e0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
381f0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75 72  _OK );.    retur
38200 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
38210 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
38220 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
38230 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
38240 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61  ert( pCur->wrFla
38250 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
38260 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
38270 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72 65  RITE && !pBt->re
38280 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
38290 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
382a0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70  heTableLock(p, p
382b0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
382c0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30  Cur->pKeyInfo!=0
382d0 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  , 2) );..  /* As
382e0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
382f0 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63 6f  ller has been co
38300 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68 69  nsistent. If thi
38310 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70 65  s cursor was ope
38320 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74 69  ned.  ** expecti
38330 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  ng an index b-tr
38340 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ee, then the cal
38350 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
38360 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20 2a  serting blob.  *
38370 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20 61  * keys with no a
38380 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e 20  ssociated data. 
38390 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  If the cursor wa
383a0 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74 69  s opened expecti
383b0 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b 65  ng an.  ** intke
383c0 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61 6c  y table, the cal
383d0 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ler should be in
383e0 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72 20  serting integer 
383f0 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a 2a  keys with a.  **
38400 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69 61   blob of associa
38410 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20  ted data.  */.  
38420 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d 30  assert( (pKey==0
38430 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
38440 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
38450 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
38460 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c  sert into a tabl
38470 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69  e b-tree, invali
38480 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
38490 62 20 0a 20