/ Hex Artifact Content
Login

Artifact 69942b33b4ed4e0cc9a36b18a288839293528267:


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 2f 0a 73 74 61 74 69 63 20 50 67 6e  r..*/.static Pgn
5f00: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
5f10: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
5f20: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
5f30: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
5f40: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
5f50: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
5f60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5f70: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
5f80: 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  );.  nPagesPerMa
5f90: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
5fa0: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
5fb0: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
5fc0: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
5fd0: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
5fe0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
5ff0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
6000: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
6010: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
6020: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
6030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
6040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
6050: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
6060: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
6070: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6080: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
6090: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
60a0: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
60b0: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
60c0: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
60d0: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
60e0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
60f0: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
6100: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
6110: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
6120: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
6130: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
6140: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
6150: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6160: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
6170: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
6180: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
6190: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
61a0: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
61b0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
61c0: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
61d0: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
61e0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
61f0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
6200: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6210: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
6220: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
6230: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
6240: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
6250: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
6260: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
6270: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
6280: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
6290: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
62a0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
62b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
62c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
62d0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
62e0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
62f0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
6300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6320: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
6330: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
6340: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
6350: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
6360: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
6370: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6380: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
6390: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
63a0: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
63b0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
63c0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
63d0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
63e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
63f0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6400: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6410: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
6420: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
6430: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
6440: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
6450: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
6460: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
6470: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
6480: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
6490: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
64a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
64b0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
64c0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
64d0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
64e0: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
64f0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6500: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
6510: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
6520: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6530: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6540: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6550: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
6560: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
6570: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
6580: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
6590: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
65a0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
65b0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
65c0: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
65d0: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
65e0: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
65f0: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6600: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6610: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6620: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6630: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6640: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6650: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
6660: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
6670: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
6680: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
6690: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
66a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
66b0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
66c0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
66d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
66e0: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
66f0: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6700: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6710: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6720: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6730: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6740: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6750: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
6760: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
6770: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
6780: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
6790: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
67a0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
67b0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
67c0: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
67d0: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
67e0: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
67f0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6800: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6810: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6820: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6830: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6840: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6850: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6860: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6870: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6880: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6890: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
68a0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
68b0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
68c0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
68d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
68e0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
68f0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6900: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6910: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6920: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6930: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6940: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6950: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6960: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6970: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6980: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6990: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
69a0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
69b0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
69c0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
69d0: 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ey);.  assert( p
69e0: 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70  EType!=0 );.  *p
69f0: 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b  EType = pPtrmap[
6a00: 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70  offset];.  if( p
6a10: 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20  Pgno ) *pPgno = 
6a20: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
6a30: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20  p[offset+1]);.. 
6a40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
6a50: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ef(pDbPage);.  i
6a60: 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20  f( *pEType<1 || 
6a70: 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75  *pEType>5 ) retu
6a80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6a90: 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e  T_BKPT;.  return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
6ab0: 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e  else /* if defin
6ac0: 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ed SQLITE_OMIT_A
6ad0: 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23  UTOVACUUM */.  #
6ae0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
6af0: 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23  (w,x,y,z,rc).  #
6b00: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74  define ptrmapGet
6b10: 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45  (w,x,y,z) SQLITE
6b20: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74  _OK.  #define pt
6b30: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78  rmapPutOvflPtr(x
6b40: 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a  , y, rc).#endif.
6b50: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62  ./*.** Given a b
6b60: 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20  tree page and a 
6b70: 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65  cell index (0 me
6b80: 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65  ans the first ce
6b90: 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  ll on.** the pag
6ba0: 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73  e, 1 means the s
6bb0: 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20  econd cell, and 
6bc0: 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e  so forth) return
6bd0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
6be0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
6bf0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
6c00: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
6c10: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
6c20: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
6c30: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
6c40: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
6c50: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
6c60: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
6c70: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
6c80: 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b  yte(&(P)->aData[
6c90: 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  (P)->cellOffset+
6ca0: 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a  2*(I)])))../*.**
6cb0: 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d   This a more com
6cc0: 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20  plex version of 
6cd0: 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20  findCell() that 
6ce0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67  works for.** pag
6cf0: 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61  es that do conta
6d00: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6d10: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
6d20: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
6d30: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6d40: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
6d50: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
6d60: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d70: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6d80: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
6d90: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
6da0: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
6db0: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
6dc0: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
6dd0: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
6de0: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
6df0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
6e00: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
6e10: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
6e20: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
6e30: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
6e40: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
6e50: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
6e60: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
6e70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
6e80: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
6e90: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
6ea0: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
6eb0: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
6ec0: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
6ed0: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
6ee0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
6ef0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
6f00: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
6f10: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
6f20: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
6f30: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
6f40: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
6f50: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
6f60: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
6f70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
6f80: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
6f90: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
6fa0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
6fb0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
6fc0: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
6fd0: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
6fe0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
6ff0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7000: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
7010: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
7020: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
7030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
7040: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7050: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
7060: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
7070: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
7080: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
7090: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
70a0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
70b0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
70c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
70d0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
70e0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
70f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
7100: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
7110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7120: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
7130: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
7140: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
7150: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7160: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
7170: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
7180: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7190: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
71a0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
71b0: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
71c0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
71d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
71e0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
71f0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
7200: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
7210: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
7220: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
7230: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
7240: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7250: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7260: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7270: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7280: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7290: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
72a0: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
72b0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
72c0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
72d0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
72e0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
72f0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
7300: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
7310: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
7320: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
7330: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7340: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
7350: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
7360: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
7370: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
7380: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
7390: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
73a0: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73 74  ader = n;.  test
73b0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
73c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
73d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
73e0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
73f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7400: 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c  if( likely(nPayl
7410: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
7420: 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
7430: 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73  This is the (eas
7440: 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  y) common case w
7450: 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20  here the entire 
7460: 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20  payload fits.   
7470: 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c   ** on the local
7480: 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66   page.  No overf
7490: 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e  low is required.
74a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
74b0: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
74c0: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
74d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
74e0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53   bytes */.    nS
74f0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
7500: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
7510: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
7520: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
7530: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
7540: 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20  .    if( (nSize 
7550: 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20  & ~3)==0 ){.    
7560: 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20    nSize = 4;    
7570: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63      /* Minimum c
7580: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
7590: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
75a0: 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e  ->nSize = (u16)n
75b0: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
75c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
75d0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
75e0: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
75f0: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
7600: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
7610: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
7620: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
7630: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
7640: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
7650: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
7660: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
7670: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
7680: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
7690: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
76a0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
76b0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
76c0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
76d0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
76e0: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
76f0: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
7700: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
7710: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
7720: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
7730: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
7740: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
7750: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
7760: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
7770: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
7780: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
7790: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
77a0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
77b0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
77c0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
77d0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
77e0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
77f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
7800: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
7810: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
7820: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
7830: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
7840: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
7850: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
7860: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
7870: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
7880: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
7890: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
78a0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
78b0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
78c0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
78d0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
78e0: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
78f0: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
7900: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
7910: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
7920: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
7930: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
7940: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
7950: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7960: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
7970: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
7980: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
7990: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
79a0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
79b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
79c0: 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e   = (u16)(pInfo->
79d0: 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20  nLocal + n);.   
79e0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
79f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
7a00: 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66   + 4;.  }.}.#def
7a10: 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70 50  ine parseCell(pP
7a20: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7a30: 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72 73  o) \.  btreePars
7a40: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
7a50: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
7a60: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
7a70: 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76 6f  Info)).static vo
7a80: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
7a90: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
7aa0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7ab0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7ac0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
7ad0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
7ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
7af0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
7b00: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
7b10: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
7b20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
7b30: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
7b40: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
7b50: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7b60: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
7b70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
7b80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
7b90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
7ba0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
7bb0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
7bc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
7bd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
7be0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
7bf0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
7c00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
7c10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
7c20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
7c30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
7c40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
7c50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
7c60: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
7c70: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
7c80: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
7c90: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
7ca0: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
7cb0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
7cc0: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
7cd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7ce0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
7cf0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
7d00: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
7d10: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
7d20: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
7d30: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
7d40: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
7d50: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
7d60: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
7d70: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
7d80: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
7d90: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
7da0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
7db0: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
7dc0: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
7dd0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
7de0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
7df0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
7e00: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74 72  debuginfo;.  btr
7e10: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
7e20: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
7e30: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
7e40: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ..  if( pPage->i
7e50: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38 20  ntKey ){.    u8 
7e60: 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  *pEnd;.    if( p
7e70: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
7e80: 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  .      pIter += 
7e90: 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65  getVarint32(pIte
7ea0: 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20 7d  r, nSize);.    }
7eb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69 7a  else{.      nSiz
7ec0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
7ed0: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
7ee0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
7ef0: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
7f00: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
7f10: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
7f20: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
7f30: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
7f40: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
7f50: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
7f60: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
7f70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7f80: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
7f90: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
7fa0: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
7fb0: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
7fc0: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
7fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
7fe0: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
7ff0: 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b  2(pIter, nSize);
8000: 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73 65  .  }..  testcase
8010: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8020: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8030: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8040: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8050: 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e   );.  if( nSize>
8060: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8070: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  ){.    int minLo
8080: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
8090: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65  Local;.    nSize
80a0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
80b0: 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29  Size - minLocal)
80c0: 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
80d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
80e0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
80f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8100: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
8110: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
8120: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
8130: 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  );.    if( nSize
8140: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
8150: 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20   ){.      nSize 
8160: 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  = minLocal;.    
8170: 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34  }.    nSize += 4
8180: 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b 3d  ;.  }.  nSize +=
8190: 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70   (u32)(pIter - p
81a0: 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Cell);..  /* The
81b0: 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
81c0: 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20 62   any cell is 4 b
81d0: 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  ytes. */.  if( n
81e0: 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e 53  Size<4 ){.    nS
81f0: 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20  ize = 4;.  }..  
8200: 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d 64  assert( nSize==d
8210: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20 29  ebuginfo.nSize )
8220: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
8230: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65 66  nSize;.}..#ifdef
8240: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
8250: 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20   This variation 
8260: 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29  on cellSizePtr()
8270: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
8280: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
8290: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20  ements.** only. 
82a0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
82b0: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
82c0: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
82d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
82e0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
82f0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
8300: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
8310: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
8320: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8330: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
8340: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
8350: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
8360: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
8370: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
8380: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
8390: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
83a0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
83b0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
83c0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
83d0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
83e0: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
83f0: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8400: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
8410: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
8420: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8430: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
8440: 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65 65  ll!=0 );.  btree
8450: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
8460: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
8470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
8480: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
8490: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
84a0: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
84b0: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e  load );.  if( in
84c0: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
84d0: 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
84e0: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
84f0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
8500: 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
8510: 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c  pPage->pBt, ovfl
8520: 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
8530: 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  W1, pPage->pgno,
8540: 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   pRC);.  }.}.#en
8550: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72  dif.../*.** Defr
8560: 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20  agment the page 
8570: 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c  given.  All Cell
8580: 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
8590: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
85a0: 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72   page and all fr
85b0: 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c  ee space is coll
85c0: 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a  ected into one.*
85d0: 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68  * big FreeBlk th
85e0: 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  at occurs in bet
85f0: 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20  ween the header 
8600: 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e  and cell.** poin
8610: 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68  ter array and th
8620: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8630: 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rea..*/.static i
8640: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
8650: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8660: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8690: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
86c0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
86d0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
86e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
86f0: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
8700: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
8710: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
8720: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8730: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
8740: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
8750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8760: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
8770: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
8780: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
8790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
87a0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
87b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
87c0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
87f0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
8800: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
8810: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
8820: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8830: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
8840: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
8850: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
8860: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
8870: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
8880: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
8890: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
88a0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
88b0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
88c0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
88d0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
88e0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
88f0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
8900: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
8910: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
8920: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
8930: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8940: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8950: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8960: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8970: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
8980: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8990: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
89a0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
89b0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
89c0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
89d0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
89e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
89f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8a10: 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65  .  temp = sqlite
8a20: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
8a30: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
8a40: 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  er);.  data = pP
8a50: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
8a60: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8a70: 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  fset;.  cellOffs
8a80: 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
8a90: 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20  Offset;.  nCell 
8aa0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
8ab0: 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d    assert( nCell=
8ac0: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
8ad0: 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61  hdr+3]) );.  usa
8ae0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
8af0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8b00: 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62  ;.  cbrk = get2b
8b10: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8b20: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d  );.  memcpy(&tem
8b30: 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  p[cbrk], &data[c
8b40: 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
8b50: 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b   - cbrk);.  cbrk
8b60: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
8b70: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
8b80: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
8b90: 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20  ll;.  iCellLast 
8ba0: 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  = usableSize - 4
8bb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8bc0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
8bd0: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
8be0: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
8bf0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
8c00: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
8c10: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
8c20: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8c30: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65  e(pAddr);.    te
8c40: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8c50: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
8c60: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
8c70: 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65  lLast );.#if !de
8c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8c90: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8ca0: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20  L_CHECK).    /* 
8cb0: 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73  These conditions
8cc0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
8cd0: 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62  en verified in b
8ce0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20  treeInitPage(). 
8cf0: 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f     ** if SQLITE_
8d00: 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f  ENABLE_OVERSIZE_
8d10: 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65  CELL_CHECK is de
8d20: 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20  fined .    */.  
8d30: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
8d40: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
8d50: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ast ){.      ret
8d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8d70: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
8d80: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
8d90: 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74  ( pc>=iCellFirst
8da0: 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73   && pc<=iCellLas
8db0: 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20  t );.    size = 
8dc0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
8dd0: 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20  e, &temp[pc]);. 
8de0: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
8df0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8e00: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8e10: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8e20: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
8e30: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
8e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8e50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8e60: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
8e70: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8e80: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
8e90: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
8ea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8eb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8ec0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  }.#endif.    ass
8ed0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
8ee0: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
8ef0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
8f00: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8f10: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
8f20: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
8f30: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
8f40: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8f50: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
8f60: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
8f70: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
8f80: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
8f90: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
8fa0: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
8fb0: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
8fc0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
8fd0: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
8fe0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
8ff0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
9000: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
9010: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
9020: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
9030: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
9040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9050: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
9060: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9070: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
9080: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
9090: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
90a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
90b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
90c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
90d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
90e0: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
90f0: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
9100: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
9110: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
9120: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
9130: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
9140: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
9150: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
9160: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
9170: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
9180: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
9190: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
91a0: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
91b0: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
91c0: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
91d0: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
91e0: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
91f0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
9200: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
9210: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
9220: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
9230: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
9240: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
9250: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
9260: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
9270: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
9280: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
9290: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
92a0: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
92b0: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
92c0: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
92d0: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
92e0: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
92f0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
9300: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
9310: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
9320: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
9330: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
9340: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
9350: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
9360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
9370: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
9380: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
9390: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
93a0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
93b0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
93c0: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
93d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
93e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
93f0: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
9400: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9410: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
9420: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
9430: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
9440: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
9450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9460: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
9470: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
9480: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
9490: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
94c0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
94d0: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
94e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
94f0: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
9500: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
9510: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
9520: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
9530: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
9540: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
9550: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
9560: 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
9570: 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65  size of the page
9580: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
9590: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
95a0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
95b0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
95c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
95d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
95e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
95f0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9600: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9610: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9620: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9630: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
9640: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
9650: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
9660: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9670: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75  erflow==0 );.  u
9680: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  sableSize = pPag
9690: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
96a0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42  ze;.  assert( nB
96b0: 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65  yte < usableSize
96c0: 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20 3d  -8 );..  nFrag =
96d0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20   data[hdr+7];.  
96e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
96f0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
9700: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
9710: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
9720: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9730: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
9740: 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74  ell;.  top = get
9750: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
9760: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
9770: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
9780: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9790: 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63 61  T_BKPT;.  testca
97a0: 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29  se( gap+2==top )
97b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
97c0: 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+1==top );.  te
97d0: 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70  stcase( gap==top
97e0: 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61 67   );..  if( nFrag
97f0: 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  >=60 ){.    /* A
9800: 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e 74  lways defragment
9810: 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e 74   highly fragment
9820: 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20 20  ed pages */.    
9830: 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
9840: 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
9850: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
9860: 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  rc;.    top = ge
9870: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9880: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 7d  ata[hdr+5]);.  }
9890: 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c 3d  else if( gap+2<=
98a0: 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  top ){.    /* Se
98b0: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
98c0: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
98d0: 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e  free slot big en
98e0: 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20  ough to satisfy 
98f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75  .    ** the requ
9900: 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61 74  est. The allocat
9910: 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f 6d  ion is made from
9920: 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
9930: 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  slot in .    ** 
9940: 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  the list that is
9950: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
9960: 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e 0a   accomadate it..
9970: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70      */.    int p
9980: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
9990: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
99a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
99b0: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
99c0: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
99d0: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
99e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
99f0: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
9a00: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
9a10: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
9a20: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
9a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9a40: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9a50: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
9a60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9a70: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
9a80: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
9a90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
9aa0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
9ab0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9ac0: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
9ad0: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
9ae0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
9af0: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
9b00: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
9b10: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
9b20: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
9b30: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
9b40: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
9b50: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
9b60: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
9b70: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
9b80: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
9b90: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
9ba0: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
9bb0: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
9bc0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
9bd0: 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20  e if( size+pc > 
9be0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
9bf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9c00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9c10: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
9c20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
9c30: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
9c40: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
9c50: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
9c60: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
9c70: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
9c80: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
9c90: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
9ca0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
9cb0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
9cc0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
9cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9ce0: 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a  *pIdx = pc + x;.
9cf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9d00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
9d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
9d20: 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
9d30: 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65 6e  sure there is en
9d40: 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74 68  ough space in th
9d50: 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66 79  e gap to satisfy
9d60: 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63 61  .  ** the alloca
9d70: 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20 64  tion.  If not, d
9d80: 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  efragment..  */.
9d90: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
9da0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
9db0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
9dc0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63 20  e>top ){.    rc 
9dd0: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
9de0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
9df0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9e00: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
9e10: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
9e20: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
9e30: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
9e40: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
9e50: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
9e60: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
9e70: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
9e80: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
9e90: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
9ea0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9eb0: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
9ec0: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
9ed0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
9ee0: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
9ef0: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
9f00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
9f10: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
9f20: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
9f30: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
9f40: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
9f50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
9f60: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
9f70: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
9f80: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
9f90: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
9fa0: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
9fb0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
9fc0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
9fd0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
9fe0: 42 79 74 65 20 3c 3d 20 70 50 61 67 65 2d 3e 70  Byte <= pPage->p
9ff0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a000: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
a010: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a030: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a040: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a050: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a060: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a070: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a080: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a090: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a0a0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a0b0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a0c0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a0d0: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a0e0: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a0f0: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a100: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a110: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a120: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a130: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a140: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
a150: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a160: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
a170: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
a180: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
a190: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
a1a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
a1c0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
a1d0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
a1e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a1f0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
a200: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
a210: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a220: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a230: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a240: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a250: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a260: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
a270: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
a280: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
a290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
a2a0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
a2b0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a2c0: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
a2d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a2e0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a2f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a300: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
a310: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
a320: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20   size is 4 */.. 
a330: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
a340: 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
a350: 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74  .    /* Overwrit
a360: 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
a370: 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
a380: 20 77 68 65 6e 20 74 68 65 20 73 65 63 75 72 65   when the secure
a390: 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f  _delete.    ** o
a3a0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
a3b0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
a3c0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20  data[start], 0, 
a3d0: 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  size);.  }..  /*
a3e0: 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20 62   Add the space b
a3f0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ack into the lin
a400: 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65  ked list of free
a410: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68  blocks.  Note th
a420: 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f  at.  ** even tho
a430: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
a440: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
a450: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
a460: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65  age(),.  ** btre
a470: 65 49 6e 69 74 50 61 67 65 28 29 20 64 69 64 20  eInitPage() did 
a480: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
a490: 61 70 70 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a  apping cells or.
a4a0: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20    ** freeblocks 
a4b0: 74 68 61 74 20 6f 76 65 72 6c 61 70 70 65 64 20  that overlapped 
a4c0: 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65  cells.   Nor doe
a4d0: 73 20 69 74 20 64 65 74 65 63 74 20 77 68 65 6e  s it detect when
a4e0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63   the.  ** cell c
a4f0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 65 78 63 65  ontent area exce
a500: 65 64 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e  eds the value in
a510: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
a520: 2e 20 20 49 66 20 74 68 65 73 65 0a 20 20 2a 2a  .  If these.  **
a530: 20 73 69 74 75 61 74 69 6f 6e 73 20 61 72 69 73   situations aris
a540: 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
a550: 6e 74 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  nt insert operat
a560: 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f 72 72 75  ions might corru
a570: 70 74 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  pt.  ** the free
a580: 6c 69 73 74 2e 20 20 53 6f 20 77 65 20 64 6f 20  list.  So we do 
a590: 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66 6f  need to check fo
a5a0: 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68 69  r corruption whi
a5b0: 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a  le scanning.  **
a5c0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
a5d0: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
a5e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
a5f0: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
a600: 20 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d    iLast = pPage-
a610: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a620: 20 2d 20 34 3b 0a 20 20 61 73 73 65 72 74 28 20   - 4;.  assert( 
a630: 73 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  start<=iLast );.
a640: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
a650: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a660: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
a670: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
a680: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 61 64     if( pbegin<ad
a690: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 72 65  dr+4 ){.      re
a6a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a6b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
a6c0: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
a6d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 62 65  n;.  }.  if( pbe
a6e0: 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20  gin>iLast ){.   
a6f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a700: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
a710: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
a720: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
a730: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
a740: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
a750: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
a760: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
a770: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
a780: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
a790: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
a7a0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
a7b0: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
a7c0: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
a7d0: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
a7e0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
a7f0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
a800: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
a810: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a820: 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20  [addr]))>0 ){.  
a830: 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69    int pnext, psi
a840: 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73 65 72  ze, x;.    asser
a850: 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29  t( pbegin>addr )
a860: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 62  ;.    assert( pb
a870: 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74  egin<=pPage->pBt
a880: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
a890: 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65  ;.    pnext = ge
a8a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
a8b0: 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65  gin]);.    psize
a8c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a8d0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a8e0: 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70    if( pbegin + p
a8f0: 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78  size + 3 >= pnex
a900: 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a  t && pnext>0 ){.
a910: 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d        int frag =
a920: 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e   pnext - (pbegin
a930: 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  +psize);.      i
a940: 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28  f( (frag<0) || (
a950: 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68  frag>(int)data[h
a960: 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20  dr+7]) ){.      
a970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a980: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a990: 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61      }.      data
a9a0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66  [hdr+7] -= (u8)f
a9b0: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
a9c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
a9d0: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
a9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
a9f0: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
aa00: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
aa10: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
aa20: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
aa30: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
aa40: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
aa50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aa60: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
aa70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
aa80: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
aa90: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
aaa0: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
aab0: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
aac0: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
aad0: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
aae0: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
aaf0: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
ab00: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
ab10: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
ab20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
ab30: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
ab40: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
ab50: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
ab60: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
ab70: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
ab80: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab90: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
aba0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
abb0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
abc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
abd0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
abe0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
abf0: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
ac00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ac10: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
ac20: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
ac30: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
ac40: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
ac50: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
ac60: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
ac70: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
ac80: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
ac90: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
aca0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
acb0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
acc0: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
acd0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
ace0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
acf0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
ad00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
ad10: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
ad20: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
ad30: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
ad40: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
ad50: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ad60: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
ad70: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
ad80: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
ad90: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
ada0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
adb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
adc0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
add0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
ade0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
adf0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
ae00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ae10: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
ae20: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
ae30: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ae40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ae50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ae60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ae70: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ae80: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ae90: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
aea0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
aeb0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
aec0: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
aed0: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
aee0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
aef0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
af00: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
af10: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
af20: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
af30: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
af40: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
af50: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
af60: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
af70: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
af80: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
af90: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
afa0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
afb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
afc0: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
afd0: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
afe0: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
aff0: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
b000: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
b010: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
b020: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
b030: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
b040: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
b050: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b070: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b080: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
b0a0: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
b0b0: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
b0c0: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
b0d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
b0e0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
b0f0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
b100: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
b110: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
b120: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
b130: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
b140: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
b150: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
b160: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
b170: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
b180: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
b190: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
b1a0: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
b1b0: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
b1c0: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
b1d0: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
b1e0: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
b1f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
b200: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
b210: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
b220: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b230: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b240: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
b250: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
b260: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
b270: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
b280: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
b290: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b2a0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b2b0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
b2c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
b2d0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
b2e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b2f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
b300: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b310: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
b320: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
b330: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
b340: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
b350: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
b360: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
b370: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
b380: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
b390: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
b3a0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
b3b0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
b3c0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
b3d0: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
b3e0: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
b3f0: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
b400: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
b410: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
b420: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
b430: 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  ure */.    int u
b440: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
b450: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
b460: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
b470: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
b480: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
b490: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
b4a0: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
b4b0: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
b4c0: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72  r */.    int nFr
b4d0: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
b4e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
b4f0: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
b500: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70  e */.    int top
b510: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
b520: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b530: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
b540: 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  ea */.    int iC
b550: 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20  ellFirst;    /* 
b560: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b570: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
b580: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  k offset */.    
b590: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b5a0: 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
b5b0: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
b5c0: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
b5d0: 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67 65  .    pBt = pPage
b5e0: 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20  ->pBt;..    hdr 
b5f0: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b600: 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70  et;.    data = p
b610: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
b620: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
b630: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
b640: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
b650: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
b670: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
b680: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
b690: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
b6a0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
b6b0: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
b6c0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
b6d0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
b6e0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
b6f0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
b700: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
b710: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
b720: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
b730: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
b740: 6c 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20  leaf;.    top = 
b750: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b760: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b770: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
b780: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b790: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
b7a0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
b7b0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
b7c0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
b7d0: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
b7e0: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
b7f0: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
b800: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
b810: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b820: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
b830: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
b840: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
b850: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
b860: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
b870: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
b880: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
b890: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
b8a0: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
b8b0: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
b8c0: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
b8d0: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
b8e0: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
b8f0: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
b900: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
b910: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
b920: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
b930: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
b940: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
b950: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
b960: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
b970: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
b980: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
b990: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
b9a0: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
b9b0: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
b9c0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
b9d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b9e0: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
b9f0: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
ba00: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ba20: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
ba30: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ba40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
ba50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
ba60: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
ba70: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
ba80: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
ba90: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
baa0: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bab0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bac0: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
bad0: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
bae0: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
baf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bb00: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bb10: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
bb20: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bb30: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bb40: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bb50: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bb60: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
bb70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bb80: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
bb90: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
bba0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
bbb0: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
bbc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
bbd0: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
bbe0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bbf0: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
bc00: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bc10: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bc20: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bc30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bc40: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bc50: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
bc60: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bc70: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bc80: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bc90: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bca0: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bcb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bcc0: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
bcd0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bce0: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
bcf0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
bd00: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
bd10: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bd20: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bd30: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
bd40: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
bd50: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
bd60: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
bd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
bd80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
bda0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bdb0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
bdc0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
bdd0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
bde0: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
bdf0: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
be00: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
be10: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
be20: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
be30: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
be40: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
be50: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
be60: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
be70: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
be80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
be90: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
bea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
beb0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
bec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
bed0: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
bee0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
bef0: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
bf00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
bf10: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
bf20: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
bf30: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
bf40: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
bf50: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
bf60: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
bf70: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
bf80: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
bf90: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
bfa0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
bfb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
bfc0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
bfd0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
bfe0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
bff0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c000: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c010: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c020: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c030: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c040: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c050: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c060: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c070: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c080: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c090: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c0a0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c0b0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c0c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c0d0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c0e0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c0f0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c100: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c110: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c120: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c130: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c140: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c150: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c160: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c170: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c180: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c190: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c1a0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c1b0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c1c0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c1d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c1e0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c1f0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c200: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c210: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c220: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c230: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c240: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c250: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c260: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c270: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c280: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c290: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c2a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c2b0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c2c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c2d0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c2e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c2f0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c300: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c310: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c320: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c330: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c340: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c350: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c360: 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
c370: 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  lete ){.    mems
c380: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c390: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c3a0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c3b0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c3c0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c3d0: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c3e0: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c3f0: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c400: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c410: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c420: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c430: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c440: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c450: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c460: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
c470: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c480: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
c490: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
c4a0: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
c4b0: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
c4c0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c4d0: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
c4e0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
c4f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
c500: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
c510: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
c520: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
c530: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
c540: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
c550: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
c560: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
c570: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
c580: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
c590: 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
c5a0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
c5b0: 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
c5c0: 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
c5d0: 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
c5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
c5f0: 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
c600: 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
c610: 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
c620: 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
c630: 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
c640: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
c650: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
c660: 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
c670: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
c680: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c690: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
c6a0: 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
c6b0: 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61  = pDbPage;.  pPa
c6c0: 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
c6d0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70   pPage->pgno = p
c6e0: 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gno;.  pPage->hd
c6f0: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  rOffset = pPage-
c700: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
c710: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   0;.  return pPa
c720: 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge; .}../*.** Ge
c730: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
c740: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
c750: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
c760: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
c770: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
c780: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
c790: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
c7a0: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
c7b0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
c7c0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
c7d0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
c7e0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
c7f0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
c800: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
c810: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
c820: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
c830: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
c840: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
c850: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
c860: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
c870: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
c880: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
c890: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
c8a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
c8b0: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
c8c0: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
c8d0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
c8e0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
c8f0: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
c900: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
c910: 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
c920: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
c930: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
c940: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
c950: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
c960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c970: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
c980: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
c990: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
c9a0: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
c9b0: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
c9c0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
c9d0: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
c9e0: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
c9f0: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
ca00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
ca10: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
ca20: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
ca30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ca40: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
ca50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ca60: 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e  gerAcquire(pBt->
ca70: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44  pPager, pgno, (D
ca80: 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65  bPage**)&pDbPage
ca90: 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
caa0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
cab0: 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20  rc;.  *ppPage = 
cac0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
cad0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
cae0: 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72  o, pBt);.  retur
caf0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cb00: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
cb10: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
cb20: 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
cb30: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
cb40: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65  e is not.** alre
cb50: 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72  ady in the pager
cb60: 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55   cache return NU
cb70: 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  LL. Initialize t
cb80: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
cb90: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
cba0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
cbb0: 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  needed..*/.stati
cbc0: 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65  c MemPage *btree
cbd0: 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61  PageLookup(BtSha
cbe0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
cbf0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
cc00: 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72  pDbPage;.  asser
cc10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cc20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
cc30: 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d  ) );.  pDbPage =
cc40: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
cc50: 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  kup(pBt->pPager,
cc60: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44   pgno);.  if( pD
cc70: 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  bPage ){.    ret
cc80: 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f  urn btreePageFro
cc90: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
cca0: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d   pgno, pBt);.  }
ccb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ccc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ccd0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
cce0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
ccf0: 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  ges. If there is
cd00: 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20   any kind of.** 
cd10: 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28  error, return ((
cd20: 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29  unsigned int)-1)
cd30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
cd40: 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
cd50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
cd60: 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50    return pBt->nP
cd70: 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74  age;.}.u32 sqlit
cd80: 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28  e3BtreeLastPage(
cd90: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
cda0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
cdb0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
cdc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d  ;.  assert( ((p-
cdd0: 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38  >pBt->nPage)&0x8
cde0: 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20  000000)==0 );.  
cdf0: 72 65 74 75 72 6e 20 28 69 6e 74 29 62 74 72 65  return (int)btre
ce00: 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
ce10: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
ce20: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
ce30: 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
ce40: 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20  alize it.  This 
ce50: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
ce60: 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65  a.** convenience
ce70: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
ce80: 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74  separate calls t
ce90: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  o btreeGetPage()
cea0: 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e   and .** btreeIn
ceb0: 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
cec0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ced0: 72 73 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  rs, then the val
cee0: 75 65 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ue *ppPage is se
cef0: 74 20 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65  t to is undefine
cf00: 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
cf10: 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
cf20: 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
cf30: 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
cf40: 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
cf50: 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
cf60: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
cf70: 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Bt,          /* 
cf80: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
cf90: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
cfa0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
cfb0: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
cfc0: 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
cfd0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20  mPage **ppPage  
cfe0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
cff0: 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
d000: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
d010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d030: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
d040: 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50   if( pgno>btreeP
d050: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
d060: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d070: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d080: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
d090: 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
d0a0: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
d0b0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
d0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d0d0: 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
d0e0: 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
d0f0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d100: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d110: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
d120: 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
d130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74  }.    }.  }..  t
d140: 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
d150: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
d160: 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
d170: 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
d180: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d190: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
d1a0: 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
d1b0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
d1c0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
d1d0: 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
d1e0: 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
d1f0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
d200: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
d210: 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
d220: 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  age ){.    asser
d230: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
d240: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d250: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
d260: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d270: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
d280: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
d290: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
d2a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d2b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d2c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d2d0: 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
d2e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
d2f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d300: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d310: 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ex) );.    sqlit
d320: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
d330: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
d340: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  }.}../*.** Durin
d350: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
d360: 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
d370: 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
d380: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
d390: 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
d3a0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
d3b0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
d3c0: 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
d3d0: 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
d3e0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
d3f0: 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
d400: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
d410: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
d420: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
d430: 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
d440: 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
d450: 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
d460: 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
d470: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
d480: 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
d490: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
d4a0: 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
d4b0: 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
d4c0: 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
d4d0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
d4e0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
d4f0: 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
d500: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d510: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d520: 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
d530: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
d540: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
d550: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d560: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
d570: 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
d580: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
d590: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d5a0: 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
d5b0: 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
d5c0: 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
d5d0: 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
d5e0: 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
d5f0: 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
d600: 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
d610: 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
d620: 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
d630: 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
d640: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
d650: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
d660: 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
d670: 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
d680: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
d690: 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
d6a0: 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
d6b0: 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
d6c0: 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
d6d0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
d6e0: 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
d6f0: 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
d700: 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
d710: 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
d720: 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
d730: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
d740: 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
d750: 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
d760: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
d770: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
d780: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
d790: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
d7a0: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
d7b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
d7c0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
d7d0: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
d7e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
d7f0: 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
d800: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
d810: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
d820: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d830: 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
d840: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
d850: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
d860: 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
d870: 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
d880: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
d890: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
d8a0: 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
d8b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d8c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
d8d0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
d8e0: 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20  s NULL.** a new 
d8f0: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
d900: 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63  random name is c
d910: 72 65 61 74 65 64 2e 20 20 54 68 69 73 20 72 61  reated.  This ra
d920: 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20  ndomly named.** 
d930: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
d940: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 77 68  ll be deleted wh
d950: 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
d960: 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
d970: 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  ..** If zFilenam
d980: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
d990: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
d9a0: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
d9b0: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
d9c0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d9d0: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
d9e0: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
d9f0: 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
da00: 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
da10: 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ned in the same 
da20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
da30: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72  ion.** and we ar
da40: 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  e in shared cach
da50: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  e mode, then the
da60: 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20   open will fail 
da70: 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54  with an.** SQLIT
da80: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72  E_CONSTRAINT err
da90: 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61  or.  We cannot a
daa0: 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65  llow two or more
dab0: 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a   BtShared.** obj
dac0: 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ects in the same
dad0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
dae0: 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67  tion since doing
daf0: 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a   so will lead.**
db00: 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74   to problems wit
db10: 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e  h locking..*/.in
db20: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  t sqlite3BtreeOp
db30: 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  en(.  const char
db40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
db50: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
db60: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
db70: 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
db80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
db90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
dba0: 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
dbb0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
dbc0: 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
dbd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
dbe0: 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
dbf0: 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
dc00: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
dc10: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
dc20: 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
dc30: 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
dc50: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
dc60: 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
dc70: 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
dc80: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
dc90: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
dca0: 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65  * The VFS to use
dcb0: 20 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20   for this btree 
dcc0: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
dcd0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
dce0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
dcf0: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
dd00: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
dd10: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
dd30: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
dd40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
dd50: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
dd60: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
dd70: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
dd80: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
dd90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
dda0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
ddb0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
ddc0: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
ddd0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
dde0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
ddf0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
de00: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
de10: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
de20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
de30: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
de40: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
de50: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
de60: 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69   /* Set the vari
de70: 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20  able isMemdb to 
de80: 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  true for an in-m
de90: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
dea0: 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66  or .  ** false f
deb0: 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20  or a file-based 
dec0: 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 73  database. This s
ded0: 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65  ymbol is only re
dee0: 71 75 69 72 65 64 20 69 66 0a 20 20 2a 2a 20 65  quired if.  ** e
def0: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 68 61  ither of the sha
df00: 72 65 64 2d 64 61 74 61 20 6f 72 20 61 75 74 6f  red-data or auto
df10: 76 61 63 75 75 6d 20 66 65 61 74 75 72 65 73 20  vacuum features 
df20: 61 72 65 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20  are compiled .  
df30: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 69 62 72  ** into the libr
df40: 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64  ary..  */.#if !d
df50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
df60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
df70: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
df80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
df90: 55 55 4d 29 0a 20 20 23 69 66 64 65 66 20 53 51  UUM).  #ifdef SQ
dfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
dfb0: 44 42 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  DB.    const int
dfc0: 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20   isMemdb = 0;.  
dfd0: 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20  #else.    const 
dfe0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46  int isMemdb = zF
dff0: 69 6c 65 6e 61 6d 65 20 26 26 20 21 73 74 72 63  ilename && !strc
e000: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
e010: 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e  memory:");.  #en
e020: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  dif.#endif..  as
e030: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
e040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e050: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
e060: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 56 66  mutex) );..  pVf
e070: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
e080: 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
e090: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
e0a0: 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
e0b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e0c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e0d0: 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
e0e0: 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
e0f0: 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
e100: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
e110: 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
e120: 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
e130: 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
e140: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
e150: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e160: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e170: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
e180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
e190: 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
e1a0: 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
e1b0: 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
e1c0: 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
e1d0: 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
e1e0: 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
e1f0: 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
e200: 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
e210: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65  .  */.  if( isMe
e220: 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69 6c 65 6e  mdb==0 && zFilen
e230: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
e240: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 76  [0] ){.    if( v
e250: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e260: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
e270: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
e280: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
e290: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e2a0: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
e2b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e2c0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
e2d0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e2e0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e2f0: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
e300: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e310: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e320: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e330: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e340: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e350: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e360: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
e370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46        sqlite3OsF
e380: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
e390: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
e3a0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
e3b0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e3c0: 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71    mutexOpen = sq
e3d0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e3e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e3f0: 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20  TIC_OPEN);.     
e400: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
e410: 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b  nter(mutexOpen);
e420: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
e430: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
e440: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
e450: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
e460: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
e470: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e480: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
e490: 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
e4a0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
e4b0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
e4c0: 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
e4d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
e4e0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
e4f0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
e500: 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
e510: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
e520: 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
e530: 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  me(pBt->pPager))
e540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e550: 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
e560: 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
e570: 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
e580: 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
e590: 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
e5a0: 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
e5b0: 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
e5c0: 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
e5d0: 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
e5e0: 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
e5f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
e600: 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
e610: 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e630: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e640: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
e660: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e670: 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
e680: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
e690: 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
e6a0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
e6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
e6c0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
e6d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e6e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
e700: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e710: 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
e720: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
e730: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
e740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e750: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e760: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e770: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
e780: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
e790: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
e7a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
e7b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
e7c0: 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
e7d0: 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
e7e0: 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
e7f0: 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
e800: 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
e810: 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
e820: 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
e830: 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
e840: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
e850: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
e860: 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
e870: 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
e880: 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
e890: 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
e8a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
e8b0: 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
e8c0: 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
e8d0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e8e0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
e8f0: 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
e900: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
e910: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
e920: 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
e930: 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
e940: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
e950: 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
e960: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
e970: 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
e980: 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
e990: 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
e9a0: 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
e9b0: 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
e9c0: 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
e9d0: 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
e9e0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
e9f0: 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
ea00: 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d   || sizeof(i64)=
ea10: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
ea20: 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
ea30: 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d   || sizeof(u64)=
ea40: 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
ea50: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
ea60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ea70: 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
ea80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
ea90: 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
eaa0: 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
eab0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
eac0: 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
ead0: 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
eae0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
eaf0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
eb00: 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
eb10: 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
eb20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
eb30: 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
eb40: 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
eb50: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
eb80: 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
eb90: 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
eba0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ebb0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ebc0: 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
ebd0: 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
ebe0: 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
ebf0: 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
ec00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ec10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ec20: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
ec30: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
ec40: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d   }.    pBt->db =
ec50: 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
ec60: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
ec70: 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
ec80: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
ec90: 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
eca0: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
ecb0: 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
ecc0: 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
ecd0: 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
ece0: 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79     pBt->readOnly
ecf0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
ed00: 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70  sreadonly(pBt->p
ed10: 50 61 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53  Pager);.#ifdef S
ed20: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
ed30: 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 73 65 63  ETE.    pBt->sec
ed40: 75 72 65 44 65 6c 65 74 65 20 3d 20 31 3b 0a 23  ureDelete = 1;.#
ed50: 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
ed60: 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
ed70: 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
ed80: 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
ed90: 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
eda0: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
edb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
edc0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
edd0: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
ede0: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
edf0: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
ee00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
ee10: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
ee20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ee30: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ee40: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ee50: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
ee60: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
ee70: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
ee80: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
ee90: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
eea0: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
eeb0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
eec0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
eed0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
eee0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
eef0: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
ef00: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
ef10: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
ef20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
ef30: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
ef40: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
ef50: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
ef60: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
ef70: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
ef80: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
ef90: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
efa0: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
efb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
efc0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
efd0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
efe0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
eff0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
f000: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
f010: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f020: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f030: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
f040: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
f050: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
f060: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f070: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
f080: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f090: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
f0a0: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
f0b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
f0c0: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
f0d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f0e0: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
f0f0: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
f100: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
f110: 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
f120: 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
f130: 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
f140: 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
f150: 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
f160: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
f170: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f180: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
f190: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
f1a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
f1b0: 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
f1c0: 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
f1d0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f1e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
f1f0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
f200: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
f210: 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
f220: 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
f230: 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
f240: 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
f250: 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
f260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f270: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
f280: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f290: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
f2a0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
f2b0: 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
f2c0: 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
f2d0: 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
f2e0: 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
f2f0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
f300: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 73  rable ){.      s
f310: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
f320: 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20 20  texShared;.     
f330: 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pBt->nRef = 1;.
f340: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
f350: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
f360: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
f370: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
f380: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
f390: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
f3a0: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
f3b0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
f3c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
f3d0: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
f3e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f3f0: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
f400: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
f410: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
f420: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f430: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
f440: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
f450: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
f460: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f470: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
f480: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f490: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f4a0: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
f4b0: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
f4c0: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
f4d0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f4e0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
f4f0: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
f500: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
f510: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
f520: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
f530: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f540: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
f550: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
f560: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f570: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f580: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f590: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f5a0: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
f5b0: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
f5c0: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
f5d0: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
f5e0: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
f5f0: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
f600: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
f610: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
f620: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
f630: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
f640: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
f650: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
f660: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
f670: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
f680: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
f690: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
f6a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
f6b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
f6c0: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
f6d0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
f6e0: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
f6f0: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
f700: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
f710: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
f720: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
f730: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
f740: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
f750: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
f760: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
f770: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
f780: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
f790: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
f7a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f7b0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
f7c0: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
f7d0: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
f7e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
f7f0: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
f800: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
f810: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
f820: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
f830: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
f840: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
f850: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
f860: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
f870: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
f880: 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
f890: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
f8a0: 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
f8b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f8c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f8e0: 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
f8f0: 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
f900: 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
f910: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
f920: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
f930: 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
f940: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
f950: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
f960: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
f970: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
f980: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
f990: 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
f9a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  ;.  }.  if( mute
f9b0: 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
f9c0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f9d0: 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
f9e0: 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
f9f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
fa00: 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
fa10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fa20: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
fa30: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
fa40: 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69  counter.  When i
fa50: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a  t reaches zero,.
fa60: 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74  ** remove the Bt
fa70: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
fa80: 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e   from the sharin
fa90: 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a  g list.  Return.
faa0: 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42  ** true if the B
fab0: 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75  tShared.nRef cou
fac0: 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72  nter reaches zer
fad0: 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20  o and return.** 
fae0: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
faf0: 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a  till positive..*
fb00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d  /.static int rem
fb10: 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69  oveFromSharingLi
fb20: 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  st(BtShared *pBt
fb30: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
fb40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
fb50: 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  CHE.  sqlite3_mu
fb60: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  tex *pMaster;.  
fb70: 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
fb80: 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
fb90: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
fba0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
fbb0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
fbc0: 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   );.  pMaster = 
fbd0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
fbe0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
fbf0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
fc00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fc10: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
fc20: 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
fc30: 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
fc40: 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
fc50: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fc60: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fc70: 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
fc80: 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
fc90: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fca0: 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
fcb0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
fcc0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
fcd0: 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
fce0: 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
fcf0: 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
fd00: 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
fd10: 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
fd20: 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
fd30: 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
fd40: 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
fd50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
fd60: 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
fd70: 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
fd80: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
fd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fda0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
fdb0: 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
fdc0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
fdd0: 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
fde0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
fdf0: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
fe00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fe10: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
fe20: 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
fe30: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
fe40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
fe50: 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
fe60: 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
fe70: 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
fe80: 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
fe90: 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
fea0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
feb0: 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
fec0: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
fed0: 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
fee0: 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
fef0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
ff00: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
ff10: 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
ff20: 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
ff30: 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
ff40: 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
ff50: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
ff60: 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
ff70: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
ff80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
ff90: 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
ffa0: 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
ffb0: 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
ffc0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
ffd0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
ffe0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
fff0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
10000 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10010 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10020 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10030 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10040 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10050 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10060 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10070 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10080 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10090 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
100a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
100b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
100c0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
100d0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
100e0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
100f0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
10100 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10110 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10120 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10130 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10140 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10150 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10160 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10170 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10190 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
101a0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
101b0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
101c0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
101d0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
101e0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
101f0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10200 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10210 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10220 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10230 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10240 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10250 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10260 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10270 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10280 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10290 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
102a0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
102b0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
102c0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
102d0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
102e0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
102f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10300 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10310 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10320 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10330 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10340 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10350 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10360 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10370 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10380 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10390 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
103a0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
103b0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
103c0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
103d0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
103e0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
103f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10400 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10410 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10420 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10430 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10440 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10450 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10460 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10470 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10480 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10490 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
104a0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
104b0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
104c0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
104d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
104e0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
104f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10500 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10510 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10520 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10530 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10540 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10550 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10560 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10570 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10580 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10590 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
105a0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
105b0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
105c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
105d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
105e0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
105f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10600 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10610 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10620 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10630 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10640 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10650 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10660 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10670 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10680 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10690 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
106a0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
106b0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
106c0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
106d0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
106e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
106f0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
10700 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
10710 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
10720 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
10730 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
10740 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
10750 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
10760 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
10770 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
10780 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
10790 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
107a0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
107b0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
107c0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
107d0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
107e0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
107f0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
10800 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
10810 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
10820 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
10830 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
10840 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
10850 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
10860 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
10870 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
10880 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
10890 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
108a0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
108b0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
108c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
108d0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
108e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
108f0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10900 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10910 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
10920 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
10930 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
10940 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
10950 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10960 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
10970 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10980 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
10990 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
109a0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
109b0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
109c0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
109d0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
109e0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
109f0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
10a00 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
10a10 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
10a20 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
10a30 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
10a40 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
10a50 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
10a60 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
10a70 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
10a80 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
10a90 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
10aa0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
10ab0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
10ac0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
10ad0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
10ae0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
10af0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
10b00 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
10b10 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
10b20 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
10b30 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
10b40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
10b50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
10b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
10b70 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
10b80 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
10b90 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
10ba0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10bb0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
10bc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10bd0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
10be0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
10bf0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10c00 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
10c10 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
10c20 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
10c30 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
10c40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10c50 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
10c60 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
10c70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
10c80 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
10c90 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
10ca0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
10cb0 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
10cc0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
10cd0 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
10ce0 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
10cf0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
10d00 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
10d10 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
10d20 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10d30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
10d40 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
10d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10d60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10d70 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
10d80 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10d90 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
10da0 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
10db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10dc0 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
10dd0 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
10de0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
10df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
10e00 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10e10 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
10e20 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
10e30 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10e40 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
10e50 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
10e60 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
10e70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
10e80 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
10e90 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
10ea0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
10eb0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
10ec0 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
10ed0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
10ee0 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
10ef0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
10f00 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
10f10 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
10f20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
10f30 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
10f40 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
10f50 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
10f60 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
10f70 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
10f80 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
10f90 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
10fa0 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
10fb0 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
10fc0 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
10fd0 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
10fe0 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
10ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
11000 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
11010 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
11020 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
11030 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
11040 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
11050 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
11060 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
11070 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
11080 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
11090 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
110a0 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
110b0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
110c0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
110d0 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
110e0 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
110f0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11100 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
11110 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67  !=0 then the pag
11120 65 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20  eSizeFixed flag 
11130 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
11140 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
11150 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
11160 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
11170 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
11180 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
11190 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
111a0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
111b0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
111c0 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
111d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
111e0 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
111f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11200 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
11210 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
11220 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
11230 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
11240 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
11250 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20  SizeFixed ){.   
11260 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11270 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
11280 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
11290 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65  Y;.  }.  if( nRe
112a0 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e  serve<0 ){.    n
112b0 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70  Reserve = pBt->p
112c0 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75  ageSize - pBt->u
112d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20  sableSize;.  }. 
112e0 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
112f0 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65  e>=0 && nReserve
11300 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70  <=255 );.  if( p
11310 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11320 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
11330 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26  _MAX_PAGE_SIZE &
11340 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65  &.        ((page
11350 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
11360 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
11370 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
11380 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  7)==0 );.    ass
11390 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65  ert( !pBt->pPage
113a0 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73  1 && !pBt->pCurs
113b0 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  or );.    pBt->p
113c0 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70  ageSize = (u32)p
113d0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65  ageSize;.    fre
113e0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
113f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
11400 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
11410 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11420 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
11430 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42   nReserve);.  pB
11440 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  t->usableSize = 
11450 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
11460 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20  (u16)nReserve;. 
11470 20 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d   if( iFix ) pBt-
11480 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
11490 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   1;.  sqlite3Btr
114a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
114b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
114c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
114d0 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
114e0 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
114f0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
11500 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
11510 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
11520 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
11530 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
11540 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
11550 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
11560 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
11570 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
11580 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
11590 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
115a0 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
115b0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
115c0 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
115d0 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
115e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
115f0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
11600 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
11610 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11620 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
11630 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
11640 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
11650 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
11660 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11670 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
11680 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
11690 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
116a0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
116b0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
116c0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
116d0 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
116e0 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
116f0 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
11700 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
11710 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
11720 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
11730 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
11740 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11750 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
11760 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11770 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
11780 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11790 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
117a0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
117b0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
117c0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
117d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
117e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
117f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11800 65 20 73 65 63 75 72 65 44 65 6c 65 74 65 20 66  e secureDelete f
11810 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
11820 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
11830 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
11840 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
11850 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
11860 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
11870 66 20 74 68 65 20 73 65 63 75 72 65 44 65 6c 65  f the secureDele
11880 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66  te.** setting af
11890 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a  ter the change..
118a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
118b0 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28  reeSecureDelete(
118c0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65  Btree *p, int ne
118d0 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b  wFlag){.  int b;
118e0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
118f0 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65  turn 0;.  sqlite
11900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11910 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30    if( newFlag>=0
11920 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e   ){.    p->pBt->
11930 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 28  secureDelete = (
11940 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20 31 20  newFlag!=0) ? 1 
11950 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20  : 0;.  } .  b = 
11960 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  p->pBt->secureDe
11970 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  lete;.  sqlite3B
11980 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11990 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64  return b;.}.#end
119a0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
119b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
119c0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
119d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
119e0 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a  T_VACUUM) */../*
119f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
11a00 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
11a10 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
11a20 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
11a30 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
11a40 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
11a50 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
11a60 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
11a70 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
11a80 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
11a90 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
11aa0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
11ab0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
11ac0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
11ad0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
11ae0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11af0 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
11b00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
11b10 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
11b20 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
11b30 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
11b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11b50 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
11b60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11b70 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
11b80 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
11b90 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11ba0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
11bb0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
11bc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11bd0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70  nter(p);.  if( p
11be0 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11bf0 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  d && (av ?1:0)!=
11c00 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11c10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11c20 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11c30 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
11c40 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
11c50 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
11c60 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
11c70 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
11c80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11ca0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11cb0 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
11cc0 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
11cd0 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
11ce0 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
11cf0 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
11d00 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
11d10 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
11d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
11d30 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
11d40 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
11d50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11d60 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
11d70 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
11d80 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
11d90 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
11da0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
11db0 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
11dc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
11dd0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
11de0 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
11df0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
11e00 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
11e10 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
11e20 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
11e30 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
11e40 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11e50 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
11e60 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
11e70 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
11e80 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
11e90 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
11ea0 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
11eb0 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
11ec0 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
11ed0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
11ee0 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
11ef0 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
11f00 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
11f10 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
11f20 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
11f30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
11f40 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
11f50 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
11f60 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
11f70 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
11f80 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
11f90 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
11fa0 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
11fb0 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
11fc0 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
11fd0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
11fe0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
11ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12000 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
12010 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
12020 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
12030 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
12040 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
12050 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
12060 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
12070 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12080 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12090 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
120a0 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
120b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
120c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
120d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
120e0 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
120f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
12110 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
12120 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
12130 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12140 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12150 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
12160 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
12170 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
12180 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
12190 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
121a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
121b0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
121c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
121d0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
121e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
121f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
12200 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
12210 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
12220 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
12230 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
12240 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
12250 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
12260 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
12270 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
12280 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
12290 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
122a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
122b0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
122c0 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
122d0 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
122e0 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
122f0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12300 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
12310 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
12320 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
12330 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
12340 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
12350 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
12360 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
12370 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
12380 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
12390 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
123a0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
123b0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
123c0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
123d0 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
123e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
123f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
12400 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12410 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
12420 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
12430 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
12440 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
12450 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
12460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12470 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12480 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12490 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
124a0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
124b0 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
124c0 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
124d0 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
124e0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
124f0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
12500 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
12510 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
12520 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
12530 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
12540 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
12550 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
12560 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
12570 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
12580 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
12590 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
125a0 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
125b0 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
125c0 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
125d0 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
125e0 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
125f0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
12600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
12610 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
12620 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
12630 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
12640 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
12650 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
12660 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
12670 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
12680 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
12690 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
126a0 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
126b0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
126c0 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
126d0 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d 3e 64  19]==2 && pBt->d
126e0 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20 29 7b  oNotUseWAL==0 ){
126f0 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65  .      int isOpe
12700 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  n = 0;.      rc 
12710 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
12720 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65  enWal(pBt->pPage
12730 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20  r, &isOpen);.   
12740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12760 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12770 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65  failed;.      }e
12780 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d  lse if( isOpen==
12790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  0 ){.        rel
127a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
127b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
127c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
127d0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
127e0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
127f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12800 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
12810 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
12820 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
12830 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
12840 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
12850 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
12860 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
12870 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
12880 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
12890 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
128a0 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
128b0 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
128c0 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
128d0 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
128e0 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
128f0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
12900 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
12910 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
12920 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
12930 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
12940 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
12950 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
12960 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
12970 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
12980 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
12990 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
129a0 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
129b0 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
129c0 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
129d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
129e0 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
129f0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
12a00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12a10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12a20 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
12a30 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
12a40 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
12a50 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
12a60 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
12a70 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
12a80 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
12a90 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
12aa0 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
12ab0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
12ac0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
12ad0 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
12ae0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
12af0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
12b00 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
12b10 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
12b20 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
12b30 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
12b40 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
12b50 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
12b60 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
12b70 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
12b80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12b90 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
12ba0 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
12bb0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
12bc0 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
12bd0 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
12be0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12bf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
12c00 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
12c10 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
12c20 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
12c30 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
12c40 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
12c50 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
12c60 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
12c70 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
12c80 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
12c90 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
12ca0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
12cd0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
12ce0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12cf0 20 7d 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65   }.    if( nPage
12d00 48 65 61 64 65 72 3e 6e 50 61 67 65 46 69 6c 65  Header>nPageFile
12d10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12d20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
12d30 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
12d40 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12d50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12d60 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
12d70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
12d80 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
12d90 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
12da0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
12db0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
12dc0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
12dd0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
12de0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12df0 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
12e00 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
12e10 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
12e20 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
12e30 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
12e40 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
12e50 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
12e60 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
12e70 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
12e80 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
12e90 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
12ea0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
12eb0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
12ec0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
12ed0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
12ee0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
12ef0 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
12f00 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
12f10 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
12f20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
12f30 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
12f40 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
12f50 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
12f60 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
12f70 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
12f80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12f90 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
12fa0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
12fb0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
12fc0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
12fd0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
12fe0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
12ff0 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
13000 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
13010 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
13020 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
13030 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
13040 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
13050 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
13060 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
13070 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
13080 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
13090 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
130a0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
130b0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
130c0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
130d0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
130e0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
130f0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13100 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
13110 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
13120 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
13130 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
13140 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
13150 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
13160 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
13170 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
13180 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
13190 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 61  2/255 - 23);.  a
131a0 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c  ssert( pBt->maxL
131b0 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43  eaf + 23 <= MX_C
131c0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b  ELL_SIZE(pBt) );
131d0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
131e0 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e   pPage1;.  pBt->
131f0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
13200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13210 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66  K;..page1_init_f
13220 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65  ailed:.  release
13230 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13240 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
13250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13260 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
13270 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
13280 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
13290 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
132a0 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
132b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
132c0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
132d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
132e0 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
132f0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
13300 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
13310 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
13320 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
13330 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
13340 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
13350 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
13360 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
13370 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
13380 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
13390 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
133a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
133b0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
133c0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
133d0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
133e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
133f0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
13400 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
13410 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74  Cursor==0 || pBt
13420 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
13430 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
13440 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
13450 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
13460 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
13470 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  1!=0 ){.    asse
13480 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  rt( pBt->pPage1-
13490 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
134a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
134b0 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
134c0 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
134d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
134e0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
134f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13500 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20  pBt->pPage1);.  
13510 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13520 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13530 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
13540 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
13550 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
13560 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
13570 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
13580 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
13590 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
135a0 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
135b0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
135c0 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
135d0 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
135e0 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
135f0 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
13600 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
13610 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
13620 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13630 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
13640 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
13650 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
13660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13670 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
13680 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
13690 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
136a0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
136b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
136c0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
136d0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
136e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
136f0 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
13700 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
13710 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
13720 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
13730 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
13740 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
13750 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
13760 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
13770 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
13780 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
13790 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
137a0 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
137b0 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
137c0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
137d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
137e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
137f0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
13800 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
13810 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
13820 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
13830 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
13840 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
13850 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
13860 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
13870 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
13880 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
13890 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
138a0 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
138b0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
138c0 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
138d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
138e0 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
138f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13900 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
13910 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
13920 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
13930 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
13940 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
13950 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
13960 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
13970 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
13980 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
13990 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
139a0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
139b0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
139c0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
139d0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
139e0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
139f0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
13a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13a10 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
13a20 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
13a30 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
13a40 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
13a50 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
13a60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13a70 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
13a80 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
13a90 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
13aa0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
13ab0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
13ac0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
13ad0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
13ae0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
13af0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
13b00 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
13b10 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
13b20 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
13b30 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
13b40 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
13b50 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
13b60 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
13b70 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
13b80 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
13b90 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
13ba0 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
13bb0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
13bc0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
13bd0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
13be0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
13bf0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
13c00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
13c10 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
13c20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
13c30 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
13c40 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
13c50 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
13c60 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
13c70 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
13c80 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
13c90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
13ca0 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
13cb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
13cc0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
13cd0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13ce0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
13cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13d00 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
13d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13d20 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
13d30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
13d40 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
13d50 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
13d60 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
13d70 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
13d80 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
13d90 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
13da0 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
13db0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
13dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
13dd0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
13de0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
13df0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
13e00 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
13e10 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
13e20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
13e30 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
13e40 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
13e50 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
13e60 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
13e70 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
13e80 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
13e90 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
13ea0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
13eb0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
13ec0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
13ed0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
13ee0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
13ef0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
13f00 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
13f10 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
13f20 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
13f30 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
13f40 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
13f50 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
13f60 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
13f70 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
13f80 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
13f90 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
13fa0 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
13fb0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
13fc0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
13fd0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
13fe0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
13ff0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
14000 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
14010 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
14020 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
14030 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
14040 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
14050 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
14060 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
14070 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
14080 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
14090 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
140a0 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
140b0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
140c0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
140d0 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
140e0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
140f0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14100 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
14110 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14120 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
14130 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
14140 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
14150 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
14160 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
14170 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
14180 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
14190 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
141a0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
141b0 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
141c0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
141d0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
141e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
141f0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
14200 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
14210 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
14220 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
14230 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
14240 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
14250 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
14260 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
14270 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
14280 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
14290 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42  base */.  if( pB
142a0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77  t->readOnly && w
142b0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
142c0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
142d0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
142e0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
142f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14300 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
14310 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
14320 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
14330 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
14340 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
14350 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
14360 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
14370 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
14380 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
14390 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
143a0 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
143b0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
143c0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
143d0 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
143e0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
143f0 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74  NS_WRITE) || pBt
14400 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20  ->isPending ){. 
14410 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d     pBlock = pBt-
14420 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20  >pWriter->db;.  
14430 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
14440 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
14450 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
14460 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
14470 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
14480 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
14490 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
144a0 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
144b0 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
144c0 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
144d0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
144e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
144f0 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29  }.  if( pBlock )
14500 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
14510 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
14520 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20  ->db, pBlock);. 
14530 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c     rc = SQLITE_L
14540 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
14550 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  E;.    goto tran
14560 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e  s_begun;.  }.#en
14570 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65  dif..  /* Any re
14580 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d  ad-only or read-
14590 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
145a0 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64  n implies a read
145b0 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70  -lock on .  ** p
145c0 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d  age 1. So if som
145d0 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  e other shared-c
145e0 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65  ache client alre
145f0 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65 2d  ady has a write-
14600 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61  lock .  ** on pa
14610 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61  ge 1, the transa
14620 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ction cannot be 
14630 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20  opened. */.  rc 
14640 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
14650 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d  heTableLock(p, M
14660 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44  ASTER_ROOT, READ
14670 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51  _LOCK);.  if( SQ
14680 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f  LITE_OK!=rc ) go
14690 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
146a0 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c  .  pBt->initiall
146b0 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28 70 42  yEmpty = (u8)(pB
146c0 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a 20 20  t->nPage==0);.  
146d0 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  do {.    /* Call
146e0 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74   lockBtree() unt
146f0 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70  il either pBt->p
14700 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74  Page1 is populat
14710 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63  ed or.    ** loc
14720 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73  kBtree() returns
14730 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
14740 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
14750 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20   lockBtree().   
14760 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
14770 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61  QLITE_OK but lea
14780 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73  ve pBt->pPage1 s
14790 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72  et to 0 if after
147a0 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
147b0 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76  page 1 it discov
147c0 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ers that the pag
147d0 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e-size of the da
147e0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66  tabase .    ** f
147f0 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e  ile is not pBt->
14800 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69  pageSize. In thi
14810 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65  s case lockBtree
14820 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20  () will update. 
14830 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53     ** pBt->pageS
14840 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d  ize to the page-
14850 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
14860 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f   on disk..    */
14870 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d  .    while( pBt-
14880 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51  >pPage1==0 && SQ
14890 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c  LITE_OK==(rc = l
148a0 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29  ockBtree(pBt)) )
148b0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
148c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
148d0 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ag ){.      if( 
148e0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
148f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
14900 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14910 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14930 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e  PagerBegin(pBt->
14940 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c  pPager,wrflag>1,
14950 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
14960 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  ory(p->db));.   
14970 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14990 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
149a0 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
149b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
149c0 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63   }.  .    if( rc
149d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
149e0 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65       unlockBtree
149f0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
14a00 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28     }.  }while( (
14a10 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45  rc&0xFF)==SQLITE
14a20 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
14a30 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14a40 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
14a50 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65       btreeInvoke
14a60 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29  BusyHandler(pBt)
14a70 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
14a80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14a90 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
14aa0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
14ab0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
14ac0 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
14ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14ae0 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
14af0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
14b00 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c  ){..assert( p->l
14b10 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
14b20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
14b30 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
14b40 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
14b50 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
14b60 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
14b70 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
14b80 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
14b90 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
14ba0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
14bb0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
14bc0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
14bd0 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
14be0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
14bf0 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
14c00 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
14c10 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
14c20 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
14c30 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
14c40 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
14c50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
14c60 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
14c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14c80 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
14ca0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
14cb0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
14cc0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
14cd0 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
14ce0 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b   (u8)(wrflag>1);
14cf0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
14d00 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
14d10 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
14d20 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
14d30 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
14d40 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
14d50 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
14d60 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
14d70 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
14d80 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
14d90 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
14da0 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
14db0 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
14dc0 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
14dd0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
14de0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
14df0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
14e00 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
14e10 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
14e20 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
14e30 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
14e40 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
14e50 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
14e60 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
14e70 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
14e80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
14e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
14ea0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
14eb0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
14ec0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
14ed0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
14ef0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
14f00 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
14f10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
14f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14f30 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
14f40 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
14f50 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
14f60 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
14f70 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
14f80 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
14f90 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
14fa0 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
14fb0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
14fc0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
14fd0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
14fe0 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
14ff0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
15000 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
15010 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
15020 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
15030 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
15040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15050 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
15060 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
15070 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
15080 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
15090 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
150a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
150b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
150c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
150d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
150e0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
150f0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
15100 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
15110 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
15120 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
15130 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
15140 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
15150 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
15160 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
15170 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
15180 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
15190 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
151a0 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
151b0 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
151c0 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
151d0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
15200 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
15210 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15240 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
15250 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
15260 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15280 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
15290 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
152a0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
152b0 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
152c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
152d0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
152e0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
152f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15300 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
15310 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
15320 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
15330 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
15340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15350 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
15360 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
15370 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
15380 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
15390 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
153a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
153b0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
153c0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
153d0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
153e0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
153f0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
15400 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
15410 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
15420 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
15430 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
15440 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
15450 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
15460 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
15470 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
15480 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
15490 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
154a0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
154b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
154c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
154d0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
154e0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
154f0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
15500 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
15510 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
15520 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
15530 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
15540 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
15550 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
15560 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
15570 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
15580 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
15590 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
155a0 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
155b0 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
155c0 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
155d0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
155e0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
155f0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
15600 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
15610 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
15620 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
15630 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
15640 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
15650 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
15670 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
15680 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
15690 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
156a0 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
156b0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
156c0 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156e0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
156f0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
15700 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
15710 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
15720 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
15730 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
15740 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
15750 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
15760 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
15770 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
15780 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
15790 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
157a0 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
157b0 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
157c0 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
157d0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
157e0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
157f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15800 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
15810 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
15820 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
15830 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
15840 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
15850 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
15860 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
15870 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
15880 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
15890 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
158a0 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
158b0 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
158c0 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
158d0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
158e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
158f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15900 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
15910 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
15920 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
15930 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
15940 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
15950 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
15960 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
15970 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
15980 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
15990 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
159a0 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
159b0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
159c0 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
159d0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
159e0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
159f0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
15a00 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
15a10 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
15a20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
15a30 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
15a40 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
15a50 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
15a60 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
15a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
15a80 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
15a90 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
15aa0 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
15ab0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
15ac0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
15ad0 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15af0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
15b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15b10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
15b20 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
15b30 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
15b40 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
15b50 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
15b60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15b80 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
15b90 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
15ba0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
15bb0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
15bc0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
15bd0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
15be0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
15bf0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
15c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15c10 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15c30 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
15c40 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
15c50 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
15c60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
15c70 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
15c80 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
15c90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ca0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
15cb0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
15cc0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
15cd0 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
15ce0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
15cf0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
15d00 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
15d10 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
15d20 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
15d30 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
15d40 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
15d50 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
15d60 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
15d70 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
15d80 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
15d90 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
15da0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
15db0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
15dc0 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
15dd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
15de0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
15df0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
15e00 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
15e10 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
15e20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
15e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
15e40 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
15e50 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
15e60 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
15e70 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
15e80 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
15e90 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
15ea0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
15eb0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
15ec0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
15ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15ee0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
15ef0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
15f00 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
15f10 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
15f20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
15f30 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
15f40 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
15f50 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
15f60 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
15f70 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
15f80 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
15f90 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
15fa0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
15fb0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
15fc0 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
15fd0 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
15fe0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
15ff0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
16000 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
16010 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
16020 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
16030 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
16040 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
16050 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
16060 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
16070 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
16080 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
16090 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
160a0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
160b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
160c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
160d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
160e0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
160f0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
16100 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
16110 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
16120 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
16130 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
16140 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
16150 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
16160 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
16170 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
16180 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
16190 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
161a0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
161b0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
161c0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
161d0 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
161e0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
161f0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
16200 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16220 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
16230 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
16240 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
16250 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
16260 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
16270 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
16280 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
16290 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
162a0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
162b0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
162c0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
162d0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
162e0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
162f0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
16300 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
16310 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
16320 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
16330 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
16340 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
16350 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
16360 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
16370 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
16380 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
16390 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
163a0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
163b0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
163c0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
163d0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
163e0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
163f0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
16400 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
16410 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
16420 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
16430 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
16440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16450 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
16460 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
16470 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
16480 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
16490 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
164a0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
164b0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
164c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
164d0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
164e0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
164f0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
16500 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16510 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
16520 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16530 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
16540 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
16550 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
16560 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
16570 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
16580 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
16590 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
165a0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
165b0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
165c0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
165d0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
165e0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
165f0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
16600 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
16610 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
16620 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
16630 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16650 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16660 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
16670 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
16680 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
16690 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
166a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
166b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
166c0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
166d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
166e0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
166f0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
16700 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
16710 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
16720 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
16730 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
16740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
16750 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
16760 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
16770 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
16780 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
16790 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
167a0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
167b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
167c0 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
167d0 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
167e0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
167f0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
16800 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
16810 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
16820 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
16830 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
16840 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
16850 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
16860 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72  successful,.** r
16870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
16880 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
16890 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
168a0 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20  therefore no.** 
168b0 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67  point in calling
168c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
168d0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
168e0 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  LITE_DONE..**.**
168f0 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
16900 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
16910 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f  attempts to re-o
16920 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20  rganize the .** 
16930 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61 74  database so that
16940 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f   the last page o
16950 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65  f the file curre
16960 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69  ntly in use.** i
16970 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
16980 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
16990 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20   nFin parameter 
169a0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
169b0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
169c0 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
169d0 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
169e0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
169f0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
16a00 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
16a10 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
16a20 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
16a30 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
16a40 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
16a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16a60 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
16a70 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
16a80 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
16a90 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72    If nFin is zer
16aa0 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  o, it is assumed
16ab0 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56 61 63   that.** incrVac
16ac0 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c 20 62  uumStep() will b
16ad0 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e 69 74  e called a finit
16ae0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
16af0 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79 20 6f  s.** which may o
16b00 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74 79 20  r may not empty 
16b10 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 41  the freelist.  A
16b20 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75 75 6d   full autovacuum
16b30 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30 2e 20  .** has nFin>0. 
16b40 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63 72 65   A "PRAGMA incre
16b50 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22 20 68  mental_vacuum" h
16b60 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73  as nFin==0..*/.s
16b70 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
16b80 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
16b90 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
16ba0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
16bb0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
16bc0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
16bd0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
16be0 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
16bf0 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
16c00 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
16c10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16c20 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
16c30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
16c40 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
16c50 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
16c60 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
16c70 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
16c80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16c90 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
16ca0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
16cb0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
16cc0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
16cd0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
16ce0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
16cf0 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
16d00 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16d10 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
16d20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
16d30 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
16d40 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
16d50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
16d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16d70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
16d80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
16d90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
16da0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
16db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16dc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16dd0 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
16de0 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
16df0 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
16e00 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nFin==0 ){.     
16e10 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
16e20 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
16e30 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
16e40 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
16e50 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
16e60 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a  if nFin is non-z
16e70 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73  ero. In that cas
16e80 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  e, the free-list
16e90 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20   will be.       
16ea0 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f   ** truncated to
16eb0 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73   zero after this
16ec0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
16ed0 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  s, so it doesn't
16ee0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74   .        ** mat
16ef0 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20  ter if it still 
16f00 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61  contains some ga
16f10 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20  rbage entries.. 
16f20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16f30 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a    Pgno iFreePg;.
16f40 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
16f50 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
16f60 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
16f70 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
16f80 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
16f90 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20  , iLastPg, 1);. 
16fa0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16fd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16fe0 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
16ff0 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
17000 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
17010 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
17020 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
17030 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
17040 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
17050 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
17060 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
17070 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
17080 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
17090 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20  stPg;..      rc 
170a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
170b0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
170c0 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
170d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
170e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
170f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17100 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
17110 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
17120 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
17130 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
17140 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
17150 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
17160 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
17170 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
17180 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
17190 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
171a0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
171b0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
171c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
171d0 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
171e0 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
171f0 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
17200 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
17210 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
17220 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
17230 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
17240 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
17250 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
17260 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
17270 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
17280 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
17290 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
172a0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
172b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
172c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
172d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
172e0 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
172f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17300 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17310 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17320 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
17330 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
17340 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
17350 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
17360 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
17370 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
17380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17390 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
173a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
173b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
173d0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
173e0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
173f0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
17400 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29  FreePg, nFin!=0)
17410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17420 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
17430 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tPg);.      if( 
17440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17450 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17460 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17470 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69  }.  }..  if( nFi
17480 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  n==0 ){.    iLas
17490 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65  tPg--;.    while
174a0 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49  ( iLastPg==PENDI
174b0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
174c0 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47 45  )||PTRMAP_ISPAGE
174d0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
174e0 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52 4d  {.      if( PTRM
174f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
17500 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
17510 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 3b     MemPage *pPg;
17520 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
17530 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17540 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c 20 30  iLastPg, &pPg, 0
17550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17560 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17570 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
17580 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
17590 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
175a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
175b0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
175c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
175d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 69  (pPg);.        i
175e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17600 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17610 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
17620 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
17630 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
17640 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
17650 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 4c 61  pBt->pPager, iLa
17660 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74 2d 3e  stPg);.    pBt->
17670 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
17680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17690 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
176a0 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61  * A write-transa
176b0 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70  ction must be op
176c0 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ened before call
176d0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
176e0 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d  n..** It perform
176f0 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20  s a single unit 
17700 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20  of work towards 
17710 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
17720 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  acuum..**.** If 
17730 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  the incremental 
17740 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68  vacuum is finish
17750 65 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75  ed after this fu
17760 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a  nction has run,.
17770 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  ** SQLITE_DONE i
17780 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
17790 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65  t is not finishe
177a0 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  d, but no error 
177b0 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c  occurred,.** SQL
177c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
177d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e  ed. Otherwise an
177e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
177f0 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  de. .*/.int sqli
17800 74 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75  te3BtreeIncrVacu
17810 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  um(Btree *p){.  
17820 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
17830 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17840 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17850 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
17860 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17870 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
17880 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
17890 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
178a0 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
178b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
178c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
178d0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
178e0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
178f0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
17900 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
17910 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 2c  cuumStep(pBt, 0,
17920 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
17930 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28 20 72  pBt));.    if( r
17940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17950 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17960 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
17970 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
17980 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
17990 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
179a0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
179b0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  >nPage);.    }. 
179c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
179d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
179e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
179f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
17a00 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
17a10 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
17a20 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
17a30 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
17a40 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74  mited for an aut
17a50 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
17a60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49  e..**.** If SQLI
17a70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17a80 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63  d, then *pnTrunc
17a90 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
17aa0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
17ab0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
17ac0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ile should be tr
17ad0 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e  uncated to durin
17ae0 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f  g the commit pro
17af0 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74  cess. .** i.e. t
17b00 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
17b10 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64  been reorganized
17b20 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68   so that only th
17b30 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63  e first *pnTrunc
17b40 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e  .** pages are in
17b50 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
17b60 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  int autoVacuumCo
17b70 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70  mmit(BtShared *p
17b80 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Bt){.  int rc = 
17b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
17ba0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
17bb0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f  ->pPager;.  VVA_
17bc0 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d  ONLY( int nRef =
17bd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
17be0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
17bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17c00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17c10 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17c20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
17c30 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
17c40 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61  .  assert(pBt->a
17c50 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66  utoVacuum);.  if
17c60 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ( !pBt->incrVacu
17c70 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  um ){.    Pgno n
17c80 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Fin;         /* 
17c90 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
17ca0 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65  in database afte
17cb0 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20  r autovacuuming 
17cc0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65  */.    Pgno nFre
17cd0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  e;        /* Num
17ce0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
17cf0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69  the freelist ini
17d00 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67  tially */.    Pg
17d10 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20  no nPtrmap;     
17d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
17d30 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
17d40 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
17d50 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20  no iFree;       
17d60 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67   /* The next pag
17d70 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  e to be freed */
17d80 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  .    int nEntry;
17d90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17da0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
17db0 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
17dc0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
17dd0 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
17de0 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
17df0 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
17e00 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
17e10 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
17e20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
17e30 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
17e40 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
17e50 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
17e60 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
17e70 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
17e80 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
17e90 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
17ea0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
17eb0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
17ec0 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
17ed0 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
17ee0 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
17ef0 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
17f00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
17f10 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
17f20 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
17f30 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
17f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
17f50 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
17f60 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
17f70 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
17f80 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
17f90 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61  Entry = pBt->usa
17fa0 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20 20 6e  bleSize/5;.    n
17fb0 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d  Ptrmap = (nFree-
17fc0 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47  nOrig+PTRMAP_PAG
17fd0 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b  ENO(pBt, nOrig)+
17fe0 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a  nEntry)/nEntry;.
17ff0 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67      nFin = nOrig
18000 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
18010 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  ap;.    if( nOri
18020 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
18030 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
18040 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
18050 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18060 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
18070 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
18080 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
18090 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
180a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
180b0 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e  t) ){.      nFin
180c0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
180d0 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72  ( nFin>nOrig ) r
180e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
180f0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20  RUPT_BKPT;..    
18100 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b  for(iFree=nOrig;
18110 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72   iFree>nFin && r
18120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46  c==SQLITE_OK; iF
18130 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ree--){.      rc
18140 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18150 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72  p(pBt, nFin, iFr
18160 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ee);.    }.    i
18170 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
18180 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
18190 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
181a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
181b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
181c0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
181d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
181e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
181f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
18200 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
18210 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18220 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
18230 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
18240 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18250 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
18260 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18270 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
18280 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e  Bt->pPager, nFin
18290 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
182a0 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
182b0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
182c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
182d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
182e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
182f0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
18300 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65  rt( nRef==sqlite
18310 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
18320 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
18330 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
18340 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
18350 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
18360 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
18370 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
18380 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
18390 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
183a0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
183b0 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
183c0 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
183d0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
183e0 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
183f0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
18400 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
18410 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
18420 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
18430 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
18440 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
18450 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
18460 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
18470 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18480 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
18490 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
184a0 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
184b0 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
184c0 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
184d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
184e0 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
184f0 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
18500 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
18510 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
18520 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
18530 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
18540 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
18550 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
18560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18570 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
18580 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
18590 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
185a0 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
185b0 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
185c0 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
185d0 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
185e0 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
185f0 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
18600 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
18610 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
18620 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
18630 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
18640 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
18650 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
18660 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
18670 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
18680 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
18690 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
186a0 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
186b0 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
186c0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
186d0 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
186e0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
186f0 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
18700 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
18710 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
18720 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18730 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
18740 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
18750 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
18760 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
18770 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
18780 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
18790 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
187a0 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
187b0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
187c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
187d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
187e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
187f0 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
18800 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
18810 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
18820 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
18830 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
18840 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
18850 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
18860 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
18870 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
18880 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
18890 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
188a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
188b0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
188c0 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
188d0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
188e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
188f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
18900 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
18910 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18920 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
18940 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
18950 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
18960 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18970 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
18980 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18990 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
189a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
189b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
189c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
189d0 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
189e0 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
189f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18a00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
18a10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18a20 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
18a30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18a40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18a60 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
18a70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
18a80 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
18a90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18aa0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
18ab0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
18ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18ad0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
18ae0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
18af0 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
18b00 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
18b10 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
18b20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
18b30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b40 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
18b50 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
18b60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18b70 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
18b80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
18b90 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
18ba0 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72 48 61  ..  btreeClearHa
18bb0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
18bc0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
18bd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 2d  TRANS_NONE && p-
18be0 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  >db->activeVdbeC
18bf0 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  nt>1 ){.    /* I
18c00 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
18c10 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
18c20 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
18c30 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
18c40 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
18c50 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
18c60 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
18c70 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
18c80 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
18c90 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
18ca0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
18cb0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
18cc0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
18cd0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
18ce0 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
18cf0 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
18d00 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
18d10 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
18d20 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
18d30 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
18d40 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
18d50 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
18d60 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
18d70 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
18d80 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
18d90 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
18da0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
18db0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
18dc0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
18dd0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
18de0 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
18df0 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
18e00 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
18e10 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
18e20 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
18e30 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
18e40 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
18e50 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
18e60 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
18e70 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
18e80 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
18e90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
18ea0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
18eb0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
18ec0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
18ed0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
18ee0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
18ef0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
18f00 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
18f10 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
18f20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
18f30 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
18f40 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
18f50 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
18f60 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
18f70 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
18f80 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
18f90 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
18fa0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
18fb0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
18fc0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
18fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
18fe0 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
18ff0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
19000 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
19010 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
19020 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
19030 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
19040 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19050 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
19060 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
19070 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
19080 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
19090 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
190a0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
190b0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
190c0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
190d0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
190e0 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
190f0 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
19100 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
19110 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
19120 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
19130 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
19140 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
19150 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
19160 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
19170 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
19180 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
19190 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
191a0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
191b0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
191c0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
191d0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
191e0 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
191f0 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
19200 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  s..**.** This wi
19210 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
19220 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
19230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19240 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
19250 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
19260 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
19270 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
19280 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
19290 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
192a0 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b  seTwo(Btree *p){
192b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
192c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
192d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
192e0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
192f0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
19300 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
19310 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
19320 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
19330 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
19340 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
19350 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
19360 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
19370 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
19380 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
19390 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
193a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
193b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
193c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
193d0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
193e0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
193f0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
19400 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
19410 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19420 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
19430 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
19440 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19450 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
19460 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
19470 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
19480 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
19490 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
194a0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  EAD;.  }..  btre
194b0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
194c0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
194d0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
194e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
194f0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
19500 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
19510 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
19520 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
19530 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
19540 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
19550 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
19560 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
19570 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
19580 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
19590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
195a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
195b0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
195c0 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
195d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
195e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
195f0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
19600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19610 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
19620 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
19630 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
19640 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
19650 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
19660 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
19670 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
19680 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
19690 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
196a0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
196b0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
196c0 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
196d0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
196e0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
196f0 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
19700 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
19710 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
19720 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
19730 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
19740 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
19750 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
19760 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
19770 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
19780 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
19790 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
197a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
197b0 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
197c0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
197d0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
197e0 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
197f0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
19800 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
19810 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
19820 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
19830 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
19840 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
19850 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
19860 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
19870 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
19880 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
19890 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
198a0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
198b0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
198c0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
198d0 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
198e0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
198f0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
19900 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
19910 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
19920 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
19930 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
19940 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
19950 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
19960 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
19970 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
19980 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
19990 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
199a0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
199b0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
199c0 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
199d0 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
199e0 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
199f0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
19a00 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
19a10 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
19a20 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
19a30 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
19a40 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
19a50 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
19a60 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
19a70 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
19a80 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
19a90 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
19aa0 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
19ab0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
19ac0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
19ad0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
19ae0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19af0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
19b00 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
19b10 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
19b20 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
19b30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19b40 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
19b50 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
19b60 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
19b70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
19b80 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
19b90 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
19ba0 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
19bb0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
19bc0 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
19bd0 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
19be0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
19bf0 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
19c00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19c10 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
19c20 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
19c30 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
19c40 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
19c50 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
19c60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
19c70 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
19c80 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
19c90 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
19ca0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
19cb0 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
19cc0 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
19cd0 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
19ce0 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
19cf0 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
19d00 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
19d10 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
19d20 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
19d30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
19d40 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
19d50 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
19d60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
19d70 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
19d80 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
19d90 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
19da0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
19db0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19dc0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
19dd0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
19de0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
19df0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
19e00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
19e10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
19e20 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
19e30 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
19e40 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64  Bt, 0, 0);.#ifnd
19e50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19e60 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66  HARED_CACHE.  if
19e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19e80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
19e90 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74  s a horrible sit
19ea0 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72  uation. An IO or
19eb0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
19ec0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a  occurred whilst.
19ed0 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
19ee0 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
19ef0 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
19f00 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
19f10 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
19f20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
19f30 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
19f40 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
19f50 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
19f60 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
19f70 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
19f80 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
19f90 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
19fa0 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
19fb0 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
19fc0 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
19fd0 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
19fe0 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
19ff0 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
1a000 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
1a010 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
1a020 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
1a030 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
1a040 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
1a050 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
1a060 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
1a070 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
1a080 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1a090 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p);..  if( p->in
1a0a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a0b0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
1a0c0 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  2;..    assert( 
1a0d0 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74  TRANS_WRITE==pBt
1a0e0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1a0f0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  );.    rc2 = sql
1a100 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1a110 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
1a120 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
1a130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a140 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1a150 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c  .    /* The roll
1a160 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65  back may have de
1a170 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67  stroyed the pPag
1a180 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e  e1->aData value.
1a190 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c    So.    ** call
1a1a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
1a1b0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
1a1c0 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
1a1d0 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
1a1e0 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
1a1f0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62  ly. */.    if( b
1a200 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1a210 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
1a220 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a230 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20      int nPage = 
1a240 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
1a250 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
1a260 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a270 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   nPage==0 );.   
1a280 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1a290 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ) sqlite3PagerPa
1a2a0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1a2b0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
1a2c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42      testcase( pB
1a2d0 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20  t->nPage!=nPage 
1a2e0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1a2f0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  age = nPage;.   
1a300 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a310 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
1a320 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
1a330 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
1a340 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
1a350 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1a360 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
1a370 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1a380 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1a390 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1a3a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a3b0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
1a3c0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
1a3d0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1a3e0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
1a3f0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
1a400 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
1a410 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
1a420 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
1a430 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
1a440 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
1a450 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
1a460 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
1a470 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
1a480 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
1a490 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
1a4a0 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
1a4b0 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
1a4c0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
1a4d0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
1a4e0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
1a4f0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
1a500 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
1a510 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
1a520 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
1a530 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
1a540 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
1a550 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
1a560 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
1a570 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
1a580 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
1a590 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
1a5a0 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
1a5b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
1a5c0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
1a5d0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
1a5e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1a5f0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
1a600 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
1a610 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1a620 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
1a630 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
1a640 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
1a650 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
1a660 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
1a670 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
1a680 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
1a690 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
1a6a0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1a6b0 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
1a6c0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
1a6d0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1a6e0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
1a6f0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
1a700 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
1a710 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
1a720 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
1a730 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
1a740 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
1a750 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
1a760 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
1a770 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1a780 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
1a790 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1a7a0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
1a7b0 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
1a7c0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
1a7d0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1a7e0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a7f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
1a800 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
1a810 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
1a820 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1a830 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72    assert( pBt->r
1a840 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20  eadOnly==0 );.  
1a850 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1a860 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
1a870 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
1a880 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
1a890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1a8a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a8b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1a8c0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
1a8d0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
1a8e0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1a8f0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
1a900 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
1a910 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
1a920 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
1a930 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
1a940 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
1a950 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
1a960 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
1a970 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
1a980 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
1a990 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
1a9a0 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
1a9b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1a9c0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
1a9d0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
1a9e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1a9f0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1aa00 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
1aa10 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
1aa20 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1aa30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aa40 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
1aa50 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1aa60 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
1aa70 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
1aa80 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
1aa90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1aaa0 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
1aab0 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
1aac0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
1aad0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
1aae0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1aaf0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
1ab00 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
1ab10 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
1ab20 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
1ab30 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
1ab40 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1ab50 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
1ab60 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
1ab70 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
1ab80 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
1ab90 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
1aba0 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
1abb0 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
1abc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1abd0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
1abe0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
1abf0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
1ac00 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
1ac10 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
1ac20 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
1ac30 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
1ac40 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
1ac50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
1ac60 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
1ac70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
1ac80 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
1ac90 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
1aca0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
1acb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1acc0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
1acd0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ace0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
1acf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1ad00 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1ad10 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
1ad20 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
1ad30 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
1ad40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1ad50 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
1ad60 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
1ad70 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
1ad80 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
1ad90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ada0 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
1adb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
1adc0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1add0 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
1ade0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
1adf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ae00 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69      if( iSavepoi
1ae10 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69  nt<0 && pBt->ini
1ae20 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42  tiallyEmpty ) pB
1ae30 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  t->nPage = 0;.  
1ae40 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1ae50 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1ae60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
1ae70 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
1ae80 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
1ae90 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
1aea0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1aeb0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1aec0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
1aed0 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
1aee0 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
1aef0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1af00 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
1af10 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
1af20 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
1af30 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
1af40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1af50 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
1af60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1af70 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1af80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1af90 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1afa0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1afb0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1afc0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1afd0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1afe0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1aff0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1b000 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1b010 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1b020 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1b030 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1b040 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1b050 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1b060 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1b070 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1b080 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1b090 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1b0a0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1b0b0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1b0c0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1b0d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1b0e0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1b0f0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1b100 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1b110 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1b120 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1b130 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1b140 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1b150 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1b160 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1b170 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1b180 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1b190 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1b1a0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1b1b0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1b1c0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1b1d0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1b1e0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1b1f0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1b200 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1b210 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1b220 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1b230 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b240 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1b250 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1b260 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1b270 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1b280 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1b290 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1b2a0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1b2b0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1b2c0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1b2d0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1b2e0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1b2f0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1b300 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1b310 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1b320 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1b330 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1b340 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1b350 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1b360 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1b370 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1b380 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1b390 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1b3a0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1b3b0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1b3c0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1b3d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1b3e0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1b3f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1b400 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1b410 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1b420 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1b430 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1b440 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1b450 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1b460 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1b470 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1b480 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1b490 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1b4a0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1b4b0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1b4c0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1b4d0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1b4e0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1b4f0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1b500 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1b510 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1b520 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b550 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1b560 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1b590 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1b5a0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1b5b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5d0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1b5e0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1b5f0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1b600 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1b610 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1b620 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1b630 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1b640 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1b670 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1b680 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1b690 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1b6a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1b6b0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1b6c0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1b6d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1b6e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1b6f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1b700 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1b710 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1b720 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1b730 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1b740 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1b750 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1b760 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1b770 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1b780 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1b790 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1b7a0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1b7b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1b7c0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1b7d0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1b7e0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1b7f0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1b800 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1b810 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1b820 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1b830 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1b840 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1b850 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1b860 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1b870 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1b880 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1b890 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1b8a0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1b8b0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1b8c0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1b8d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1b8e0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1b8f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1b900 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1b910 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1b920 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1b930 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1b940 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1b950 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1b960 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  && pBt->readOnly
1b970 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1b980 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1b990 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
1b9a0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
1b9b0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
1b9c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1b9d0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a  ITE_EMPTY;.  }..
1b9e0 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
1b9f0 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
1ba00 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
1ba10 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
1ba20 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
1ba30 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
1ba40 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
1ba50 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
1ba60 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
1ba70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
1ba80 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
1ba90 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
1baa0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
1bab0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
1bac0 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
1bad0 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
1bae0 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
1baf0 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70   (u8)wrFlag;.  p
1bb00 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
1bb10 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  ->pCursor;.  if(
1bb20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1bb30 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1bb40 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20  >pPrev = pCur;. 
1bb50 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f   }.  pBt->pCurso
1bb60 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
1bb70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1bb80 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75  R_INVALID;.  pCu
1bb90 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d  r->cachedRowid =
1bba0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1bbb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
1bbc0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1bbd0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
1bc10 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc40 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
1bc50 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
1bc60 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc90 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1bca0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1bcb0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1bcc0 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1bcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1bce0 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
1bcf0 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
1bd00 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
1bd30 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
1bd40 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1bd50 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bd60 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r(p);.  rc = btr
1bd70 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62  eeCursor(p, iTab
1bd80 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79  le, wrFlag, pKey
1bd90 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73  Info, pCur);.  s
1bda0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1bdb0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1bdc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1bdd0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
1bde0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1bdf0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
1be00 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
1be10 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
1be20 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
1be30 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
1be40 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
1be50 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
1be60 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
1be70 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
1be80 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
1be90 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
1bea0 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
1beb0 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
1bec0 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
1bed0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
1bee0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bef0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
1bf00 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
1bf10 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
1bf20 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
1bf30 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
1bf40 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
1bf50 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
1bf60 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
1bf70 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
1bf80 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
1bf90 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
1bfa0 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
1bfb0 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
1bfc0 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
1bfd0 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
1bfe0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
1bff0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
1c000 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
1c010 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
1c020 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
1c030 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
1c040 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
1c050 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
1c060 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1c070 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
1c080 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1c090 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1c0a0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
1c0b0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
1c0c0 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
1c0d0 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
1c0e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63 68  .** Set the cach
1c0f0 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f  ed rowid value o
1c100 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 69  f every cursor i
1c110 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
1c120 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70  ase file.** as p
1c130 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74  Cur and having t
1c140 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67  he same root pag
1c150 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72  e number as pCur
1c160 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a  .  The value is.
1c170 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64  ** set to iRowid
1c180 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73  ..**.** Only pos
1c190 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75  itive rowid valu
1c1a0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1c1b0 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73  d valid for this
1c1c0 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63   cache..** The c
1c1d0 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69  ache is initiali
1c1e0 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64  zed to zero, ind
1c1f0 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c  icating an inval
1c200 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62  id cache..** A b
1c210 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66  tree will work f
1c220 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72  ine with zero or
1c230 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1c240 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f  .  We just canno
1c250 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20  t.** cache zero 
1c260 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1c270 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  ds, which means 
1c280 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65 20  tables that use 
1c290 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74  zero or.** negat
1c2a0 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74  ive rowids might
1c2b0 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
1c2c0 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72  ower.  But in pr
1c2d0 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20  actice, zero.** 
1c2e0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
1c2f0 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f  ds are very unco
1c300 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f  mmon so this sho
1c310 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f  uld not be a pro
1c320 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
1c330 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
1c340 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1c350 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33  r *pCur, sqlite3
1c360 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a  _int64 iRowid){.
1c370 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1c380 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74   for(p=pCur->pBt
1c390 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
1c3a0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
1c3b0 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  f( p->pgnoRoot==
1c3c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1c3d0 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20   p->cachedRowid 
1c3e0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20  = iRowid;.  }.  
1c3f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61  assert( pCur->ca
1c400 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69  chedRowid==iRowi
1c410 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  d );.}../*.** Re
1c420 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64 20  turn the cached 
1c430 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67 69  rowid for the gi
1c440 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e  ven cursor.  A n
1c450 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a  egative or zero.
1c460 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1c470 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1c480 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 69  he rowid cache i
1c490 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  s invalid and sh
1c4a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72  ould be.** ignor
1c4b0 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69  ed.  If the rowi
1c4c0 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76 65  d cache has neve
1c4d0 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65  r before been se
1c4e0 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72  t, then a.** zer
1c4f0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  o is returned..*
1c500 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1c510 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 43  sqlite3BtreeGetC
1c520 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
1c530 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
1c540 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65  turn pCur->cache
1c550 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dRowid;.}../*.**
1c560 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
1c570 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
1c580 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1c590 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
1c5a0 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
1c5b0 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
1c5c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1c5d0 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
1c5e0 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
1c5f0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
1c600 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
1c610 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
1c620 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1c630 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1c640 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
1c650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c660 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
1c670 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1c680 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
1c690 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
1c6a0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
1c6b0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
1c6c0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1c6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c6e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1c6f0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
1c700 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1c710 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
1c720 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1c730 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
1c740 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1c750 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
1c760 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1c770 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1c780 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1c790 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
1c7a0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1c7b0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
1c7c0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
1c7d0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
1c7e0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
1c7f0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
1c800 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1c810 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1c820 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1c830 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1c840 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
1c850 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1c860 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
1c870 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
1c880 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
1c890 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
1c8a0 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
1c8b0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
1c8c0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
1c8d0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
1c8e0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
1c8f0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1c900 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
1c910 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
1c920 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
1c930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1c940 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
1c950 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
1c960 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
1c970 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
1c980 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
1c990 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
1c9a0 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
1c9b0 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
1c9c0 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
1c9d0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
1c9e0 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
1c9f0 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
1ca00 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
1ca10 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
1ca20 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
1ca30 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
1ca40 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
1ca50 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
1ca60 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
1ca70 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1ca80 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
1ca90 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67  ressive inlining
1caa0 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61 20  .)  So we use a 
1cab0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  real function.**
1cac0 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20   for MSVC and a 
1cad0 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74  macro for everyt
1cae0 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b  hing else.  Tick
1caf0 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66  et #2457..*/.#if
1cb00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
1cb10 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
1cb20 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1cb30 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
1cb40 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1cb50 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1cb60 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
1cb70 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
1cb80 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
1cb90 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1cba0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1cbb0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1cbc0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1cbd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1cbe0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1cbf0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1cc00 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1cc10 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1cc20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1cc30 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1cc40 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1cc50 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1cc60 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1cc70 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1cc80 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1cc90 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1cca0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1ccb0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1ccc0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1ccd0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1cce0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1ccf0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1cd00 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1cd10 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1cd20 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64  Page],pCur->aiId
1cd30 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e  x[iPage],&pCur->
1cd40 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75  info);.      pCu
1cd50 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31  r->validNKey = 1
1cd60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cd70 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
1cd80 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  o(pCur);.    }. 
1cd90 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e   }.#else /* if n
1cda0 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20  ot _MSC_VER */. 
1cdb0 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20   /* Use a macro 
1cdc0 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d  in all other com
1cdd0 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74  pilers so that t
1cde0 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  he function is i
1cdf0 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e  nlined */.#defin
1ce00 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43  e getCellInfo(pC
1ce10 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ur)             
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28           \.  if(
1ce50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1ce60 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  e==0 ){         
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
1cea0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
1ceb0 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20 20  ->iPage;        
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1cef0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1cf00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1cf10 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1cf20 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1cf30 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
1cf40 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
1cfe0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
1cff0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
1d030 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
1d040 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   */..#ifndef NDE
1d050 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  BUG  /* The next
1d060 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e   routine used on
1d070 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1d080 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f  () statements */
1d090 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1d0a0 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  ue if the given 
1d0b0 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69  BtCursor is vali
1d0c0 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73  d.  A valid curs
1d0d0 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61  or is one.** tha
1d0e0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1d0f0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77  ointing to a row
1d100 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79   in a (non-empty
1d110 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73  ) table..** This
1d120 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69   is a verificati
1d130 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  on routine is us
1d140 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1d150 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1d160 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1d170 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
1d180 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70  alid(BtCursor *p
1d190 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
1d1a0 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74  Cur && pCur->eSt
1d1b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d1c0 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e  D;.}.#endif /* N
1d1d0 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1d1e0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
1d1f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1d200 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
1d210 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
1d220 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
1d230 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1d240 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
1d250 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1d260 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
1d270 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
1d280 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
1d290 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
1d2a0 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
1d2b0 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
1d2c0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1d2d0 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
1d2e0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
1d2f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
1d300 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ey..**.** The ca
1d310 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69  ller must positi
1d320 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72  on the cursor pr
1d330 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1d340 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
1d350 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
1d360 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20  e cannot fail.  
1d370 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  It always return
1d380 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a  s SQLITE_OK.  .*
1d390 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1d3a0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
1d3b0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
1d3c0 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Size){.  assert(
1d3d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d3e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1d3f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1d400 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1d410 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
1d420 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1d430 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1d440 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
1d450 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  LID ){.    *pSiz
1d460 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1d470 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1d480 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a  pCur);.    *pSiz
1d490 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1d4a0 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Key;.  }.  retur
1d4b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d4c0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1d4d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1d4e0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1d4f0 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65  in the entry the
1d500 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65  .** cursor curre
1d510 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
1d520 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1d530 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
1d540 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
1d550 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
1d560 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
1d570 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
1d580 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
1d590 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
1d5a0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
1d5b0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
1d5c0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
1d5d0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d5e0 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72  ID..**.** Failur
1d5f0 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  e is not possibl
1d600 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  e.  This functio
1d610 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  n always returns
1d620 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49   SQLITE_OK..** I
1d630 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20  t might just as 
1d640 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64  well be a proced
1d650 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76  ure (returning v
1d660 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74  oid) but we cont
1d670 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72  inue.** to retur
1d680 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73  n an integer res
1d690 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73  ult code for his
1d6a0 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e  torical reasons.
1d6b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d6c0 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43  treeDataSize(BtC
1d6d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1d6e0 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
1d6f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1d700 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1d710 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d720 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d730 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
1d740 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
1d750 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1d760 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e  .nData;.  return
1d770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d780 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70  *.** Given the p
1d790 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e  age number of an
1d7a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1d7b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  n the database (
1d7c0 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66  parameter.** ovf
1d7d0 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  l), this functio
1d7e0 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65  n finds the page
1d7f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1d800 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1d810 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  .** linked list 
1d820 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
1d830 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  s. If possible, 
1d840 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f  it uses the auto
1d850 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74  -vacuum.** point
1d860 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74  er-map data inst
1d870 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74  ead of reading t
1d880 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1d890 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f  ge ovfl to do so
1d8a0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
1d8b0 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53  rror occurs an S
1d8c0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1d8d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1d8e0 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54  herwise:.**.** T
1d8f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d900 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
1d910 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1d920 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a  linked list is .
1d930 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
1d940 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
1d950 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61  e ovfl is the la
1d960 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c  st page in its l
1d970 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20  inked .** list, 
1d980 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
1d990 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
1d9a0 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
1d9b0 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72  ot NULL, and a r
1d9c0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1d9d0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63  MemPage object c
1d9e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
1d9f0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
1da00 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65  Ovfl was obtaine
1da10 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  d, then *ppPage 
1da20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1da30 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  to that.** refer
1da40 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20  ence. It is the 
1da50 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
1da60 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
1da70 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65  call releasePage
1da80 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65  ().** on *ppPage
1da90 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66   to free the ref
1daa0 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65  erence. In no re
1dab0 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61  ference was obta
1dac0 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a  ined (because.**
1dad0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1dae0 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74   was used to obt
1daf0 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f  ain the value fo
1db00 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74  r *pPgnoNext), t
1db10 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69  hen.** *ppPage i
1db20 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a  s set to zero..*
1db30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1db40 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20  OverflowPage(.  
1db50 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db70 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
1db80 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  e */.  Pgno ovfl
1db90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1dba0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
1dbb0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1dbc0 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ber */.  MemPage
1dbd0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1dbe0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1dbf0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1dc00 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1dc10 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc30 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1dc40 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1dc50 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1dc60 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1dc70 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1dc80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1dc90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1dca0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1dcb0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1dcc0 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1dcd0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1dce0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1dcf0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1dd00 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1dd10 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1dd20 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1dd30 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1dd40 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1dd50 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1dd60 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1dd70 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1dd80 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1dd90 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1dda0 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1ddb0 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1ddc0 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1ddd0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1dde0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1ddf0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1de00 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1de10 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1de20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1de30 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1de40 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1de50 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1de60 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1de70 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1de80 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1de90 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1dea0 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1deb0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1dec0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1ded0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1dee0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1def0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1df00 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1df10 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1df20 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1df30 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1df40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1df50 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1df60 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1df70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1df80 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1df90 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1dfa0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1dfb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dfc0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1dfd0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d  ( next==0 || rc=
1dfe0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
1dff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e000 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1e010 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1e020 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
1e030 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1e040 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1e050 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
1e060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
1e080 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
1e090 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
1e0a0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
1e0b0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
1e0c0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
1e0d0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
1e0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
1e0f0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
1e100 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
1e110 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
1e120 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
1e130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
1e140 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
1e150 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
1e160 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
1e170 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
1e180 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
1e190 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
1e1a0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
1e1b0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
1e1c0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
1e1d0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
1e1e0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
1e1f0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
1e200 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
1e210 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
1e220 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
1e230 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
1e240 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
1e250 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
1e260 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
1e270 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
1e280 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
1e290 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
1e2a0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
1e2b0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
1e2c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e2d0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1e2e0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
1e2f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1e300 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
1e310 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
1e320 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
1e330 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1e340 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
1e350 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1e360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e370 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
1e380 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e3a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1e3b0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
1e3c0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
1e3d0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
1e3e0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
1e3f0 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
1e400 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
1e410 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
1e420 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
1e430 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
1e440 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
1e450 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
1e460 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
1e470 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
1e480 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1e490 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1e4a0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
1e4b0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1e4c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e4d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e4e0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
1e4f0 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
1e500 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
1e510 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1e520 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
1e530 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
1e540 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
1e550 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
1e560 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
1e570 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1e580 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1e5a0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
1e5b0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
1e5c0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
1e5d0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
1e5e0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
1e5f0 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
1e600 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70  g to. If the eOp
1e610 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
1e620 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65   0, this is a re
1e630 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61  ad operation (da
1e640 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a  ta copied into.*
1e650 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20  * buffer pBuf). 
1e660 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  If it is non-zer
1e670 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61  o, a write (data
1e680 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20   copied from.** 
1e690 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a  buffer pBuf)..**
1e6a0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22  .** A total of "
1e6b0 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72  amt" bytes are r
1e6c0 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62  ead or written b
1e6d0 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66  eginning at "off
1e6e0 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73  set"..** Data is
1e6f0 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d   read to or from
1e700 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
1e710 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
1e720 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f  ent being read o
1e730 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  r written might 
1e740 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61  appear on the ma
1e750 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65  in page.** or be
1e760 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f   scattered out o
1e770 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66  n multiple overf
1e780 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  low pages..**.**
1e790 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72   If the BtCursor
1e7a0 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  .isIncrblobHandl
1e7b0 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  e flag is set, a
1e7c0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  nd the current.*
1e7d0 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  * cursor entry u
1e7e0 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
1e7f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1e800 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1e810 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65   allocates space
1e820 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
1e830 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76  popluates the ov
1e840 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1e850 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79   .** cache array
1e860 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
1e870 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e  flow). Subsequen
1e880 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
1e890 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b  .** cache to mak
1e8a0 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65  e seeking to the
1e8b0 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74   supplied offset
1e8c0 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
1e8d0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
1e8e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1e8f0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
1e900 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
1e910 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
1e920 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
1e930 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
1e940 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
1e950 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
1e960 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
1e970 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
1e980 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
1e990 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
1e9a0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
1e9b0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
1e9c0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
1e9d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
1e9e0 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
1e9f0 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
1ea00 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
1ea10 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
1ea20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
1ea30 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
1ea40 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
1ea50 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
1ea60 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
1ea70 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
1ea80 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
1ea90 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1eaa0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1eab0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1eac0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1ead0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
1eae0 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
1eaf0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
1eb00 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
1eb10 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
1eb20 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
1eb30 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
1eb40 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
1eb50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
1eb60 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
1eb70 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
1eb80 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
1eb90 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
1eba0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
1ebb0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
1ebc0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
1ebd0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1ebe0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
1ebf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
1ec00 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
1ec10 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
1ec20 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1ec30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ec40 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
1ec50 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
1ec60 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
1ec70 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1ec80 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1ec90 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
1eca0 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
1ecb0 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
1ecc0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
1ecd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ece0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1ecf0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1ed00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1ed10 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1ed20 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
1ed30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ed40 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
1ed50 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1ed60 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1ed70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
1ed80 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
1ed90 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
1eda0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
1edb0 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
1edc0 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
1edd0 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61  ( NEVER(offset+a
1ede0 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1edf0 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20  info.nData) .   
1ee00 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  || &aPayload[pCu
1ee10 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
1ee20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
1ee30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
1ee40 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  .  ){.    /* Try
1ee50 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
1ee60 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
1ee70 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
1ee80 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
1ee90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1eea0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1eeb0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
1eec0 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
1eed0 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
1eee0 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
1eef0 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
1ef00 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
1ef10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
1ef20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1ef30 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
1ef40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1ef50 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
1ef60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1ef70 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
1ef80 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
1ef90 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1efa0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1efb0 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44  , eOp, pPage->pD
1efc0 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
1efd0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
1efe0 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
1eff0 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
1f000 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
1f010 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1f020 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
1f030 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
1f040 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33   ){.    const u3
1f050 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74  2 ovflSize = pBt
1f060 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
1f070 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74  ;  /* Bytes cont
1f080 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67  ent per ovfl pag
1f090 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65  e */.    Pgno ne
1f0a0 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78  xtPage;..    nex
1f0b0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
1f0c0 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d  (&aPayload[pCur-
1f0d0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a  >info.nLocal]);.
1f0e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f0f0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1f100 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e    /* If the isIn
1f110 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61  crblobHandle fla
1f120 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
1f130 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
1f140 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73  low[].    ** has
1f150 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1f160 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74  ted, allocate it
1f170 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20   now. The array 
1f180 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20  is sized at.    
1f190 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  ** one entry for
1f1a0 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
1f1b0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1f1c0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20  low chain. The. 
1f1d0 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65     ** page numbe
1f1e0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
1f1f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1f200 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
1f210 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65  low[0],.    ** e
1f220 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
1f230 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
1f240 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20  w[] array means 
1f250 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a  "not yet known".
1f260 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68      ** (the cach
1f270 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
1f280 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
1f290 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49     if( pCur->isI
1f2a0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
1f2b0 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1f2c0 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  w ){.      int n
1f2d0 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
1f2e0 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
1f2f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
1f300 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
1f310 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  ze;.      pCur->
1f320 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e  aOverflow = (Pgn
1f330 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o *)sqlite3Mallo
1f340 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e  cZero(sizeof(Pgn
1f350 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20  o)*nOvfl);.     
1f360 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77   /* nOvfl is alw
1f370 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49  ays positive.  I
1f380 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20  f it were zero, 
1f390 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75  fetchPayload wou
1f3a0 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  ld have.      **
1f3b0 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65   been used inste
1f3c0 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ad of this routi
1f3d0 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ne. */.      if(
1f3e0 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26   ALWAYS(nOvfl) &
1f3f0 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1f400 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
1f410 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1f420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f430 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
1f440 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1f450 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1f460 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1f470 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
1f480 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
1f490 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
1f4a0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
1f4b0 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
1f4c0 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
1f4d0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
1f4e0 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1f4f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
1f500 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
1f510 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
1f520 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
1f530 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1f540 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1f550 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
1f560 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
1f570 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
1f580 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
1f590 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
1f5a0 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
1f5b0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
1f5c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f5d0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1f5e0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
1f5f0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
1f600 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1f610 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
1f620 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1f630 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1f640 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
1f650 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1f660 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
1f670 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
1f680 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
1f690 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1f6a0 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1f6b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1f6c0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
1f6d0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
1f6e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
1f6f0 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
1f700 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
1f710 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
1f720 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1f730 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
1f740 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1f750 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
1f760 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1f770 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
1f780 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
1f790 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
1f7a0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
1f7b0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
1f7c0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1f7d0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1f7e0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1f7f0 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1f800 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1f810 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1f820 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1f830 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1f840 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1f850 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1f860 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1f870 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1f880 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1f890 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1f8a0 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1f8b0 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1f8c0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1f8d0 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1f8e0 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1f8f0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
1f900 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
1f910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f920 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
1f930 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
1f940 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
1f950 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
1f960 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
1f970 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
1f980 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
1f990 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
1f9a0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
1f9b0 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
1f9c0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
1f9d0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1f9e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1f9f0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
1fa00 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
1fa10 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
1fa20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1fa30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fa40 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
1fa50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1fa60 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
1fa70 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1fa80 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
1fa90 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
1faa0 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
1fab0 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
1fac0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
1fad0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
1fae0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1faf0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
1fb00 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1fb10 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
1fb20 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
1fb30 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
1fb40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fb50 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1fb60 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
1fb70 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
1fb80 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
1fb90 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
1fba0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1fbb0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
1fbc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1fbd0 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
1fbe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fbf0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1fc00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fc10 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1fc20 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
1fc30 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1fc40 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1fc50 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1fc60 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1fc70 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1fc80 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1fc90 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1fca0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1fcb0 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
1fcc0 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69  t pCur is pointi
1fcd0 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f  ng to a valid ro
1fce0 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c  w.** in the tabl
1fcf0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
1fd00 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1fd10 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1fd20 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1fd30 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1fd40 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1fd50 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1fd60 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1fd70 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1fd80 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1fd90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1fda0 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20  reeKey(BtCursor 
1fdb0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
1fdc0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
1fdd0 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
1fde0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fdf0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1fe00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1fe10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1fe20 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1fe30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1fe40 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1fe50 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1fe60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1fe70 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1fe80 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
1fe90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
1fea0 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
1feb0 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
1fec0 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
1fed0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
1fee0 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
1fef0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
1ff00 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
1ff10 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
1ff20 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
1ff30 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
1ff40 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
1ff50 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
1ff60 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
1ff70 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
1ff80 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1ff90 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1ffa0 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
1ffb0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
1ffc0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
1ffd0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
1ffe0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
1fff0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
20000 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
20010 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
20020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20030 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
20040 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
20050 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
20060 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
20070 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
20080 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
20090 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
200a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
200b0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
200c0 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
200d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
200e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
200f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
20100 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
20110 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
20120 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
20130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20140 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20150 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20160 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
20170 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
20180 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
20190 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
201a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
201b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
201c0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
201d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
201e0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
201f0 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
20200 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
20210 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20  mt, pBuf, 0);.  
20220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20230 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
20240 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
20250 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
20260 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
20270 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
20280 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
20290 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
202a0 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
202b0 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
202c0 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
202d0 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
202e0 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
202f0 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
20300 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
20310 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
20320 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
20330 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
20340 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
20350 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
20360 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
20370 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
20380 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
20390 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
203a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
203b0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
203c0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
203d0 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
203e0 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
203f0 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
20400 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
20410 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
20420 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
20430 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
20440 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
20450 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
20460 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
20470 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
20480 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
20490 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
204a0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
204b0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
204c0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
204d0 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
204e0 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
204f0 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
20500 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
20510 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
20520 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
20530 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
20540 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
20550 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
20560 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
20570 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
20580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20590 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
205a0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
205b0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
205c0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
205d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
205e0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
205f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
20600 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
20610 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
20620 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
20630 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
20640 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
20650 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
20660 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
20670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
20680 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
20690 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
206a0 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
206b0 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
206c0 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
206d0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
206e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
206f0 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
20700 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
20710 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61  Key;.  u32 nLoca
20720 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
20730 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
20740 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
20750 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20760 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
20770 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20780 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20790 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
207a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
207b0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
207c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
207d0 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
207e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
207f0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
20800 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
20810 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66   NEVER(pCur->inf
20820 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20  o.nSize==0) ){. 
20830 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
20840 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  l(pCur->apPage[p
20850 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75  Cur->iPage], pCu
20860 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20870 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20  Page],.         
20880 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72 2d            &pCur-
20890 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50  >info);.  }.  aP
208a0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
208b0 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61  nfo.pCell;.  aPa
208c0 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69  yload += pCur->i
208d0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69  nfo.nHeader;.  i
208e0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
208f0 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30   ){.    nKey = 0
20900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
20910 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  Key = (int)pCur-
20920 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
20930 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b    if( skipKey ){
20940 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  .    aPayload +=
20950 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61   nKey;.    nLoca
20960 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
20970 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20  Local - nKey;.  
20980 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61  }else{.    nLoca
20990 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l = pCur->info.n
209a0 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  Local;.    asser
209b0 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20  t( nLocal<=nKey 
209c0 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d  );.  }.  *pAmt =
209d0 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
209e0 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
209f0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
20a00 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
20a10 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
20a20 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
20a30 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
20a40 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
20a50 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
20a60 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
20a70 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
20a80 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
20a90 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
20aa0 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
20ab0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
20ac0 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
20ad0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
20ae0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
20af0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
20b00 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
20b10 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
20b20 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
20b30 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
20b40 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
20b50 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
20b60 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
20b70 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
20b80 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
20b90 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
20ba0 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
20bb0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
20bc0 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
20bd0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
20be0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
20bf0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
20c00 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
20c10 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
20c20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
20c30 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
20c40 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
20c50 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
20c60 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
20c70 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
20c80 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
20c90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20ca0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
20cb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
20cc0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20cd0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20ce0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
20cf0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20d00 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
20d10 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
20d20 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
20d30 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
20d40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
20d50 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
20d60 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
20d70 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
20d80 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
20d90 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20    const void *p 
20da0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
20db0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
20dc0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
20dd0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
20de0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20df0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20e00 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
20e10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20e20 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20  SOR_VALID) ){.  
20e30 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69    p = (const voi
20e40 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
20e50 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
20e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
20e70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
20e80 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
20e90 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
20ea0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
20eb0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
20ec0 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
20ed0 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
20ee0 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
20ef0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20f00 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
20f10 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
20f20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
20f30 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
20f40 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
20f50 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
20f60 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
20f70 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
20f80 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
20f90 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
20fa0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
20fb0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
20fc0 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
20fd0 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
20fe0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
20ff0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
21000 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
21010 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
21020 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
21030 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
21040 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
21050 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
21060 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
21070 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21080 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21090 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
210a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
210b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
210c0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
210d0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
210e0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
210f0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
21100 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
21110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21120 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
21130 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
21140 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
21150 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
21160 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21170 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
21180 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
21190 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
211a0 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
211b0 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
211c0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
211d0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
211e0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
211f0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
21200 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
21210 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
21220 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
21230 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
21240 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21250 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
21260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21270 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
21280 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
21290 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
212a0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
212b0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
212c0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
212d0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
212e0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
212f0 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
21300 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
21310 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
21320 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
21330 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
21340 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
21350 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
21360 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
21370 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
21380 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
21390 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
213a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
213b0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
213c0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
213d0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
213e0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
213f0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
21400 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
21410 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
21420 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
21430 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
21440 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
21450 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
21460 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
21470 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21480 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
21490 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
214a0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
214b0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
214c0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
214d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
214e0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
214f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
21500 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
21510 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
21520 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
21530 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
21540 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
21550 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
21560 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
21570 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
21580 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
21590 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
215a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
215b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
215c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
215d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
215e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
215f0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
21600 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
21610 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
21620 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
21630 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21640 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
21650 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21660 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
21670 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
21680 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
21690 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
216a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
216b0 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  .  assertParentI
216c0 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e  ndex(.    pCur->
216d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
216e0 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72  ge-1], .    pCur
216f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21700 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
21710 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21720 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29  iPage]->pgno.  )
21730 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
21740 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21750 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
21760 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
21770 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
21780 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
21790 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
217a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
217b0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
217c0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
217d0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
217e0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
217f0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
21800 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
21810 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
21820 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
21830 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
21840 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
21850 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
21860 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
21870 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
21880 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
21890 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
218a0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
218b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
218c0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
218d0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
218e0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
218f0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
21900 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
21910 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
21920 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
21930 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
21940 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
21950 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
21960 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
21970 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
21980 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
21990 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
219a0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
219b0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
219c0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
219d0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
219e0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
219f0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
21a00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
21a10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
21a20 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
21a30 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
21a40 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
21a50 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
21a60 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21a70 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
21a80 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
21a90 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
21aa0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
21ab0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
21ac0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
21ad0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
21ae0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
21af0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
21b00 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
21b10 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
21b20 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
21b30 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
21b40 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
21b50 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
21b60 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
21b70 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
21b80 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
21b90 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
21ba0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
21bb0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
21bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
21bd0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
21be0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
21bf0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
21c00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21c10 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
21c20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
21c30 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21c40 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
21c50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
21c60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
21c70 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
21c80 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
21c90 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
21ca0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
21cb0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
21cc0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
21cd0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
21ce0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
21cf0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
21d00 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
21d10 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
21d20 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
21d30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21d40 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
21d50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
21d60 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
21d70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
21d80 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
21d90 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
21da0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
21db0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
21dc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
21dd0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
21de0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
21df0 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
21e00 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
21e10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
21e20 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
21e30 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
21e40 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  iPage = 0;.  }el
21e50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
21e60 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
21e70 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
21e80 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
21e90 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
21ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21eb0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
21ec0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
21ed0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
21ee0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
21ef0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
21f00 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
21f10 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
21f20 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
21f30 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
21f40 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
21f50 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
21f60 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
21f70 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
21f80 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
21f90 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
21fa0 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
21fb0 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
21fc0 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
21fd0 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
21fe0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
21ff0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
22000 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
22010 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22020 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
22030 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
22040 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
22050 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
22060 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
22070 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
22080 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
22090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
220a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
220b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
220c0 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
220d0 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
220e0 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
220f0 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
22100 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
22110 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
22120 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
22130 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
22140 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
22150 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
22160 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
22170 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
22180 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
22190 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
221a0 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
221b0 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
221c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
221d0 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
221e0 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
221f0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
22200 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
22210 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
22220 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
22230 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
22240 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
22250 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
22260 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
22270 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
22280 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
22290 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
222a0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
222b0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
222c0 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
222d0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
222e0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
222f0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
22300 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
22310 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
22320 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
22330 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
22340 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
22350 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
22360 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
22370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22380 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
22390 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
223a0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
223b0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
223c0 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
223d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
223e0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
223f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
22400 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
22410 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
22420 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
22430 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
22440 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
22450 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
22460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22470 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22480 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
22490 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
224a0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
224b0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
224c0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
224d0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
224e0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
224f0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
22500 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
22510 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
22520 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
22530 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
22540 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
22550 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
22560 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
22570 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
22580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
22590 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
225a0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
225b0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
225c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
225d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
225e0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
225f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22600 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
22610 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22620 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
22630 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
22640 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22650 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
22660 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
22670 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22680 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
22690 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
226a0 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
226b0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
226c0 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
226d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
226e0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
226f0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
22700 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
22710 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
22720 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
22730 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
22740 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
22750 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
22760 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
22770 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
22780 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
22790 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
227a0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
227b0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
227c0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
227d0 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
227e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
227f0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
22800 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
22810 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
22820 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
22830 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
22840 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
22850 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
22860 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
22870 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
22880 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
22890 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
228a0 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
228b0 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
228c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
228d0 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
228e0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
228f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
22900 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
22910 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
22920 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22930 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
22940 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22950 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
22960 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22970 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
22980 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
22990 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
229a0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
229b0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
229c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
229d0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
229e0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
229f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
22a00 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
22a10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22a20 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
22a30 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
22a40 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
22a50 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
22a60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
22a70 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
22a80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
22a90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
22aa0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
22ab0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
22ac0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
22ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
22ae0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
22af0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
22b00 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
22b10 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
22b20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
22b30 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
22b40 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
22b50 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
22b60 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
22b70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22b80 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
22b90 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
22ba0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
22bb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
22bc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22bd0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22be0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22bf0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
22c00 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
22c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22c20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
22c30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22c40 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
22c50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22c60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22c70 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
22c80 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
22c90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22ca0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22cb0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22cc0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
22cd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
22ce0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
22cf0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
22d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
22d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
22d20 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
22d30 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
22d40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
22d50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22d60 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
22d70 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
22d80 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
22d90 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
22da0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
22db0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
22dc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
22dd0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
22de0 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
22df0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22e00 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
22e10 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
22e20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22e30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22e40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22e50 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
22e60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
22e70 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
22e80 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
22e90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
22ea0 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
22eb0 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
22ec0 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
22ed0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
22ee0 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
22ef0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
22f00 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
22f10 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
22f20 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
22f30 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
22f40 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
22f50 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
22f60 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
22f70 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
22f80 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
22f90 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
22fa0 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
22fb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
22fc0 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
22fd0 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
22fe0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
22ff0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
23000 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
23010 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23020 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
23030 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
23040 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23050 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
23060 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
23070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23080 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
23090 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
230a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
230b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
230c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
230d0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
230e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
230f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23100 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
23110 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
23120 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
23130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23140 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23150 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
23160 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23170 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
23180 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
23190 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
231a0 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
231b0 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
231c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
231d0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
231e0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
231f0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
23200 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
23210 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
23220 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
23230 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
23240 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
23250 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
23260 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
23270 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
23280 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
23290 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
232a0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
232b0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
232c0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
232d0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
232e0 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
232f0 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
23300 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23310 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
23320 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
23330 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
23340 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
23350 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
23360 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
23370 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
23380 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
23390 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
233a0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
233b0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
233c0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
233d0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
233e0 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
233f0 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
23400 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
23410 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
23420 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
23430 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
23440 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
23450 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
23460 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
23470 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
23480 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
23490 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
234a0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
234b0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
234c0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
234d0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
234e0 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
234f0 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
23500 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
23510 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23520 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
23530 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
23540 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
23550 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
23560 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
23570 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
23580 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
23590 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235b0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
235c0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
235d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
235e0 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
235f0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
23600 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
23610 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
23620 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
23630 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
23640 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
23650 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
23660 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
23670 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
23680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
23690 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
236a0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
236b0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
236c0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
236d0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
236e0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
236f0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
23700 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
23710 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
23720 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
23730 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
23740 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
23750 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23770 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
23780 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
23790 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
237a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
237b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
237c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
237d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
237e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
237f0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
23800 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65  ( pRes );.  asse
23810 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29  rt( (pIdxKey==0)
23820 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ==(pCur->pKeyInf
23830 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  o==0) );..  /* I
23840 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
23850 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
23860 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
23870 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
23880 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
23890 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
238a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
238b0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
238c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
238d0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
238e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
238f0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
23900 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
23910 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
23920 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
23930 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
23940 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
23950 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23960 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
23970 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
23980 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
23990 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
239a0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
239b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
239c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
239d0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
239e0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
239f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23a00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
23a10 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23a20 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
23a30 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
23a40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
23a50 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65  isInit );.  asse
23a60 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23a70 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
23a80 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Cell>0 || pCur->
23a90 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
23aa0 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  NVALID );.  if( 
23ab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23ac0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
23ad0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
23ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23af0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23b00 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
23b10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
23b20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
23b30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23b40 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
23b50 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
23b60 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
23b70 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
23b80 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
23b90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
23ba0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23bb0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
23bc0 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50  nt c;..    /* pP
23bd0 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20  age->nCell must 
23be0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
23bf0 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73  zero. If this is
23c00 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
23c10 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72     ** the cursor
23c20 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
23c30 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61   INVALID above a
23c40 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20  nd this for(;;) 
23c50 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  loop.    ** not 
23c60 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20  run. If this is 
23c70 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67  not the root-pag
23c80 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65  e, then the move
23c90 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e  ToChild() routin
23ca0 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68  e.    ** would h
23cb0 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65  ave already dete
23cc0 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69  cted db corrupti
23cd0 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70  on. Similarly, p
23ce0 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a  Page must.    **
23cf0 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69   be the right ki
23d00 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62  nd (index or tab
23d10 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61  le) of b-tree pa
23d20 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20  ge. Otherwise.  
23d30 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69    ** a moveToChi
23d40 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f  ld() or moveToRo
23d50 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20  ot() call would 
23d60 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f  have detected co
23d70 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
23d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
23d90 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
23da0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
23db0 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d  ntKey==(pIdxKey=
23dc0 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d  =0) );.    lwr =
23dd0 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
23de0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
23df0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
23e00 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  ){.      pCur->a
23e10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
23e20 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20 20  ] = (u16)upr;.  
23e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
23e40 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23e50 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
23e60 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
23e70 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
23e80 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d  .      int idx =
23e90 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23ea0 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49 6e  r->iPage]; /* In
23eb0 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 63  dex of current c
23ec0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
23ed0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
23f00 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
23f10 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
23f20 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ..      pCur->in
23f30 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
23f40 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
23f50 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
23f60 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
23f70 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
23f80 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
23f90 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
23fa0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
23fb0 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
23fc0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
23fd0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
23fe0 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
23ff0 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
24000 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
24010 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
24020 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
24030 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
24040 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
24050 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
24060 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
24070 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
24080 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
24090 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
240a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
240b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
240c0 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
240d0 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
240e0 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
240f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
24100 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
24110 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
24120 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
24130 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
24140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
24150 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
24160 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
24170 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
24180 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
24190 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
241a0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
241b0 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
241c0 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
241d0 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
241e0 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
241f0 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
24200 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
24210 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
24220 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
24230 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
24240 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
24250 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
24260 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
24270 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
24280 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
24290 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
242a0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
242b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
242c0 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
242d0 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
242e0 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
242f0 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
24300 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
24310 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
24320 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24330 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
24340 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
24350 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30  ( !(nCell & 0x80
24360 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61 67  ) && nCell<=pPag
24370 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
24380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
24390 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
243a0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
243b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
243c0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
243d0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
243e0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
243f0 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
24400 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
24410 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
24420 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
24430 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
24440 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
24450 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
24460 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
24470 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
24480 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
24490 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
244a0 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
244b0 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
244c0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
244d0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
244e0 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
244f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24500 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
24510 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
24520 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
24530 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
24540 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
24550 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
24560 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
24570 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
24580 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
24590 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
245a0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
245b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
245c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
245d0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
245e0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
245f0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
24600 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
24610 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
24620 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
24630 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
24640 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
24650 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
24660 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
24670 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
24680 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
24690 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
246a0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
246b0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
246c0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
246d0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
246e0 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
246f0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
24700 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
24710 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
24720 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
24730 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
24740 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
24750 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
24760 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
24770 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
24780 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
24790 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
247a0 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
247b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
247c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
247d0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
247e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
247f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
24800 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
24810 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
24820 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
24830 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24840 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
24850 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
24860 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
24870 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
24880 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24890 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
248a0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
248b0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
248c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
248d0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
248e0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
248f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
24900 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
24910 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
24920 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
24930 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
24940 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
24950 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24960 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
24970 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
24980 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
24990 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
249a0 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
249b0 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
249c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
249d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
249e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
249f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
24a00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
24a10 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
24a20 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
24a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24a40 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
24a50 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
24a60 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
24a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
24a80 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
24a90 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
24aa0 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
24ab0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
24ac0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24ad0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
24ae0 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
24af0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
24b00 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
24b10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
24b20 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
24b30 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
24b40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
24b50 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
24b60 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
24b70 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
24b80 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
24b90 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
24ba0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
24bb0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
24bc0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
24bd0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
24be0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
24bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24c00 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
24c10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24c20 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
24c30 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
24c40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24c50 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
24c60 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
24c70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24c80 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
24c90 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
24ca0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
24cb0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
24cc0 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
24cd0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24ce0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
24cf0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
24d00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
24d10 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
24d20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
24d30 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
24d40 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
24d50 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
24d60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
24d70 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
24d80 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
24d90 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
24da0 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
24db0 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
24dc0 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
24dd0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
24de0 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
24df0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
24e00 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24e10 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
24e20 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
24e30 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
24e40 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
24e50 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
24e60 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
24e70 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
24e90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
24ea0 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
24eb0 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
24ec0 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
24ed0 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
24ee0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
24ef0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
24f00 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
24f10 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
24f20 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
24f30 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
24f40 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
24f50 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
24f60 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
24f70 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
24f80 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
24f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
24fa0 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
24fb0 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
24fc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
24fd0 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
24fe0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
24ff0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
25000 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
25010 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
25020 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
25030 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
25040 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
25050 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
25060 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
25070 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
25080 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
25090 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
250a0 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
250b0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
250c0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
250d0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
250e0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
250f0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
25100 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
25110 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
25120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25140 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
25150 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
25160 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
25170 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
25180 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
25190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
251a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
251b0 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
251c0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
251d0 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
251e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
251f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25200 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
25210 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
25220 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25230 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
25240 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
25250 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
25260 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25270 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
25280 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d  ert( idx<=pPage-
25290 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75  >nCell );..  pCu
252a0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
252b0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
252c0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
252d0 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
252e0 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
252f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
25300 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
25310 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
25320 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
25330 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25340 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
25350 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25360 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
25370 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
25380 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
25390 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
253a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
253b0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
253c0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
253d0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
253e0 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
253f0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
25400 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
25410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25420 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
25430 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
25440 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
25450 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
25460 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
25470 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
25480 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25490 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
254a0 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
254b0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
254c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
254d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
254e0 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
254f0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
25500 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25510 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
25520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
25530 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
25540 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
25550 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25560 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
25570 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
25580 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
25590 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
255a0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
255b0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
255c0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
255d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
255e0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
255f0 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
25600 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
25610 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
25620 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
25630 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
25640 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
25650 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
25660 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
25670 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
25680 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
25690 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
256a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
256b0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
256c0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
256d0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
256e0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
256f0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25700 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
25710 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
25720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
25730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
25740 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
25750 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
25760 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
25770 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
25780 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
25790 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
257a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
257b0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
257c0 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  ext<0 ){.    pCu
257d0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
257e0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
257f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25800 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
25810 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
25820 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
25830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25840 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
25850 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
25860 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
25870 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
25880 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
25890 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
258a0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
258b0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
258c0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
258d0 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
258e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
258f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25900 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
25910 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
25920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
25930 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
25940 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20  pCur->iPage]==0 
25950 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
25960 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
25970 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74         pCur->eSt
25980 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
25990 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70  ALID;.        *p
259a0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
259b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
259c0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
259d0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
259e0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ur);.    }.    p
259f0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
25a00 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
25a10 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
25a20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
25a30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
25a40 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
25a50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25a60 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
25a70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
25a80 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
25a90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25aa0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
25ab0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
25ac0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
25ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25ae0 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d   }.  }.  *pRes =
25af0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
25b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
25b10 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72  te a new page fr
25b20 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
25b30 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
25b40 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b  new page is mark
25b50 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49  ed as dirty.  (I
25b60 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73  n other words, s
25b70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25b80 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  ().** has alread
25b90 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  y been called on
25ba0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20   the new page.) 
25bb0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61   The new page ha
25bc0 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72  s also.** been r
25bd0 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68  eferenced and th
25be0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
25bf0 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  e is responsible
25c00 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   for calling.** 
25c10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25c20 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  f() on the new p
25c30 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64  age when it is d
25c40 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  one..**.** SQLIT
25c50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25c60 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e   on success.  An
25c70 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76  y other return v
25c80 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a  alue indicates.*
25c90 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70  * an error.  *pp
25ca0 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Page and *pPgno 
25cb0 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e  are undefined in
25cc0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
25cd0 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f   error..** Do no
25ce0 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  t invoke sqlite3
25cf0 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
25d00 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72  *ppPage if an er
25d10 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ror is returned.
25d20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
25d30 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
25d40 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
25d50 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72  a (feeble) effor
25d60 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
25d70 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
25d80 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
25d90 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
25da0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
25db0 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
25dc0 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
25dd0 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
25de0 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
25df0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
25e00 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
25e10 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
25e20 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
25e30 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
25e40 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61  the "exact" para
25e50 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
25e60 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d  and the page-num
25e70 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74  ber nearby exist
25e80 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  s .** anywhere o
25e90 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
25ea0 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
25eb0 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  enteed to be ret
25ec0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69  urned. This.** i
25ed0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61  s only used by a
25ee0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
25ef0 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61  ases when alloca
25f00 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
25f10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25f20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
25f30 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
25f40 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt, .  MemPage *
25f50 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f  *ppPage, .  Pgno
25f60 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f   *pPgno, .  Pgno
25f70 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78   nearby,.  u8 ex
25f80 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  act.){.  MemPage
25f90 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
25fa0 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
25fb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25fc0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
25fd0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
25fe0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25ff0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
26000 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
26010 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
26020 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
26030 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
26040 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
26050 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
26060 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
26070 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26080 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
26090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
260a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
260b0 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e    pPage1 = pBt->
260c0 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65  pPage1;.  mxPage
260d0 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
260e0 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67 65  t(pBt);.  n = ge
260f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
26100 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
26110 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
26120 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
26130 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
26140 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
26150 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
26160 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
26170 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
26180 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
26190 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
261a0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
261b0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
261c0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
261d0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
261e0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
261f0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
26200 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
26210 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
26220 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65 74   'exact' paramet
26230 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64 20  er was true and 
26240 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
26250 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
26260 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
26270 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
26280 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
26290 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
262a0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
262b0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
262c0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
262d0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
262e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
262f0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26300 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26 26      if( exact &&
26310 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20   nearby<=mxPage 
26320 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79 70  ){.      u8 eTyp
26330 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
26340 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
26350 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
26360 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
26370 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
26380 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20  et(pBt, nearby, 
26390 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20  &eType, 0);.    
263a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
263b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20  n rc;.      if( 
263c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
263d0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
263e0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
263f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26400 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b  *pPgno = nearby;
26410 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
26420 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
26430 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
26440 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
26450 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
26460 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
26470 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
26480 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
26490 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
264a0 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
264b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
264c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
264d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
264e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
264f0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
26500 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
26510 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
26520 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
26530 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
26540 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
26550 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
26560 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
26570 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
26580 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
26590 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
265a0 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
265b0 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
265c0 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
265d0 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
265e0 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ated..    */.   
265f0 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65   do {.      pPre
26600 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b  vTrunk = pTrunk;
26610 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76  .      if( pPrev
26620 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
26630 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
26640 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
26650 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
26660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26670 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
26680 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
26690 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [32]);.      }. 
266a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
266b0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
266c0 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e  .      if( iTrun
266d0 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  k>mxPage ){.    
266e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
266f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26710 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26720 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
26730 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
26740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26750 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
26760 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
26770 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26780 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26790 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   }..      k = ge
267a0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
267b0 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
267c0 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
267d0 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
267e0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
267f0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
26800 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
26810 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
26820 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
26830 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
26840 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
26850 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
26860 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
26870 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
26880 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
26890 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
268a0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
268b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
268c0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
268d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
268e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
268f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
26900 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
26910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
26920 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
26930 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
26940 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
26950 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
26960 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
26970 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
26980 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
26990 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
269a0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
269b0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
269c0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
269d0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
269e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
269f0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
26a00 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
26a10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
26a20 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
26a30 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
26a40 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
26a50 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
26a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
26a70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
26a80 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
26a90 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  age;.#ifndef SQL
26aa0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
26ab0 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  UUM.      }else 
26ac0 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26  if( searchList &
26ad0 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b  & nearby==iTrunk
26ae0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26af0 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67  he list is being
26b00 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68   searched and th
26b10 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  is trunk page is
26b20 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
26b30 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65    ** to allocate
26b40 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
26b50 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c  whether it has l
26b60 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  eaves..        *
26b70 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
26b80 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b  ( *pPgno==iTrunk
26b90 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50   );.        *ppP
26ba0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
26bb0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
26bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
26bd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
26be0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
26bf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
26c00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26c10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
26c20 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
26c30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
26c40 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
26c50 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
26c60 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
26c70 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
26c80 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
26c90 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
26ca0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
26cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26cc0 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72   memcpy(&pPrevTr
26cd0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
26ce0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
26cf0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26d00 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
26d10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
26d20 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
26d30 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
26d40 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f  caller but it co
26d50 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20  ntains .        
26d60 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f    ** pointers to
26d70 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65   free-list leave
26d80 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61  s. The first lea
26d90 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e  f becomes a trun
26da0 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  k.          ** p
26db0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
26dc0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
26dd0 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65           MemPage
26de0 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20   *pNewTrunk;.   
26df0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77         Pgno iNew
26e00 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
26e10 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
26e20 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8]);.          i
26e30 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50  f( iNewTrunk>mxP
26e40 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20  age ){ .        
26e50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26e60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26e70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
26e80 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
26e90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
26ea0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
26eb0 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50  ( iNewTrunk==mxP
26ec0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  age );.         
26ed0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
26ee0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
26ef0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
26f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
26f30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
26f40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
26f50 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
26f60 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26f70 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
26f80 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26f90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
26fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
26fb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26fc0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
26fd0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
26fe0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
26ff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27000 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
27010 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
27020 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
27030 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
27040 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
27050 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
27060 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
27070 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
27080 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
27090 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
270a0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
270b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
270c0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
270d0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
270e0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
270f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27100 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
27110 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
27120 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
27130 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
27140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27150 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
27160 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
27170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
27180 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27190 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
271a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
271b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
271c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
271d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
271e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
271f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
27200 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
27210 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27220 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
27230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27240 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
27250 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
27260 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
27270 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
27280 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
27290 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
272a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
272b0 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
272c0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
272d0 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
272e0 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
272f0 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
27300 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
27310 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
27320 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
27330 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
27340 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  a;.        rc = 
27350 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27360 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
27370 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
27380 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
27390 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
273a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
273b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  }.        if( ne
273c0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
273d0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
273e0 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
273f0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
27400 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
27410 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
27420 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
27430 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
27440 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
27450 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
27460 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
27470 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27480 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
27490 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
274a0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
274b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
274c0 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
274d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
274e0 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
274f0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
27500 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
27510 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
27520 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
27530 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27550 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
27560 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
27570 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
27580 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
27590 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
275a0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
275b0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
275c0 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
275d0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
275e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
275f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27600 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
27610 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
27620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27630 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
27640 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
27650 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
27660 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61  st || iPage==nea
27670 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
27680 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
27690 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
276a0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
276b0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
276c0 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
276d0 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
276e0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
276f0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
27700 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
27710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27720 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
27730 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
27740 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
27750 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
27760 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
27770 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
27780 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
27790 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
277a0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
277b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
277c0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
277d0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
277e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
277f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
27800 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
27810 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) );.          n
27820 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
27830 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
27840 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20  Bt, *pPgno);.   
27850 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
27860 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
27870 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
27880 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
27890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
278a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
278b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
278c0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
278d0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
278e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
278f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27900 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27910 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
27920 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
27930 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
27940 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
27950 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
27960 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27970 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27980 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  revTrunk);.     
27990 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b   pPrevTrunk = 0;
279a0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61  .    }while( sea
279b0 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  rchList );.  }el
279c0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65  se{.    /* There
279d0 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e   are no pages on
279e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73   the freelist, s
279f0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70  o create a new p
27a00 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a  age at the.    *
27a10 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
27a20 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
27a30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27a40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
27a50 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
27a60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27a70 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
27a80 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
27a90 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
27aa0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
27ab0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
27ac0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27ad0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
27ae0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
27af0 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
27b00 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
27b10 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
27b20 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
27b30 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
27b40 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
27b50 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
27b60 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
27b70 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
27b80 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
27b90 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
27ba0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
27bb0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
27bc0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
27bd0 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
27be0 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
27bf0 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
27c00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
27c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
27c20 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
27c30 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
27c40 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
27c50 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
27c60 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
27c70 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
27c80 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
27c90 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
27ca0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
27cb0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
27cc0 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  ge, &pPg, 1);.  
27cd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27cf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27d00 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
27d10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
27d20 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
27d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27d40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
27d50 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
27d60 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
27d70 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
27d80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
27d90 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
27da0 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
27db0 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
27dc0 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
27dd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
27de0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
27df0 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
27e00 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
27e10 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
27e20 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
27e30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
27e40 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
27e50 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 31  pPgno, ppPage, 1
27e60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
27e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
27e80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27e90 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
27ea0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
27eb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27ec0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
27ed0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
27ee0 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
27ef0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
27f00 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
27f10 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
27f20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
27f30 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
27f40 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
27f50 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27f60 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
27f70 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
27f80 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
27f90 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  nk);.  if( rc==S
27fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27fb0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
27fc0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70  PageRefcount((*p
27fd0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
27fe0 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  >1 ){.      rele
27ff0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
28000 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
28010 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
28020 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
28030 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
28040 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
28050 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
28060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
28070 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
28080 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
28090 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
280a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
280b0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
280c0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
280d0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
280e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
280f0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
28100 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
28110 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
28120 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28130 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
28140 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
28150 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
28160 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
28170 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
28180 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
28190 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
281a0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
281b0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
281c0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
281d0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
281e0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
281f0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
28200 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
28210 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
28220 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
28230 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
28240 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
28250 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
28260 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
28270 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
28280 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
28290 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
282a0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
282b0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
282c0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
282d0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
28300 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
28310 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
28340 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
28350 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
28360 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
28370 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
28380 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
28390 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
283a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
283b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
283c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
283d0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
283e0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
283f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
28420 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
28430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28450 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
28460 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
28470 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
28480 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
28490 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
284a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
284b0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
284c0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
284d0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
284e0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
284f0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
28500 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
28510 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
28520 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
28530 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
28540 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
28550 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
28560 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
28570 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
28580 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
28590 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
285a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
285b0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
285c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
285d0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
285e0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
285f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
28600 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
28610 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28620 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
28630 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
28640 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
28650 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
28660 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
28670 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
28680 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
28690 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
286a0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
286b0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
286c0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
286d0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
286e0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
286f0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
28700 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
28710 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
28720 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
28730 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
28740 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
28750 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
28760 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
28770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
28780 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
28790 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
287a0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
287b0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
287c0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
287d0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
287e0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
287f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
28800 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
28810 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
28820 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
28830 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
28840 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
28850 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
28860 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
28870 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
28880 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
28890 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
288a0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
288b0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
288c0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
288d0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
288e0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
288f0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
28900 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
28910 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
28920 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
28930 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
28940 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
28950 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
28960 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
28970 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
28980 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
28990 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
289a0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
289b0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
289c0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
289d0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
289e0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
289f0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
28a00 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
28a10 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
28a20 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
28a30 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
28a40 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
28a50 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
28a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28a70 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
28a80 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
28a90 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
28aa0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
28ab0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
28ac0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
28ad0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28ae0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
28af0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
28b00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28b10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
28b20 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
28b30 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
28b40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
28b50 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
28b60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28b70 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
28b80 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
28b90 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
28ba0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
28bb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28bc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28bd0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
28be0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
28bf0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
28c00 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
28c10 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
28c20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
28c30 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
28c40 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
28c50 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
28c60 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
28c70 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
28c80 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
28c90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
28ca0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
28cb0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
28cc0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
28cd0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
28ce0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
28cf0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
28d00 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
28d10 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
28d20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
28d30 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
28d40 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
28d50 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
28d60 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
28d70 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
28d80 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
28d90 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
28da0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
28db0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
28dc0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
28dd0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
28de0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
28df0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
28e00 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
28e10 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
28e20 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
28e30 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
28e40 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
28e50 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
28e60 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
28e70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
28e80 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
28e90 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
28ea0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
28eb0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
28ec0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
28ed0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
28ee0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
28ef0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
28f00 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
28f10 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
28f20 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
28f30 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
28f40 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
28f50 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
28f60 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
28f70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
28f80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28f90 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
28fa0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
28fb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28fc0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
28fd0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
28fe0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
28ff0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
29000 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
29010 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
29020 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
29030 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e   pPage && !pBt->
29040 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
29050 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29060 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
29070 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
29080 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29090 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
290a0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
290b0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
290c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
290d0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
290e0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
290f0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
29100 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
29110 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
29120 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
29130 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
29140 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
29150 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
29160 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
29170 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
29180 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
29190 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
291a0 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
291b0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
291c0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
291d0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
291e0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
291f0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
29200 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
29210 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
29220 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
29230 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
29240 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
29250 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
29260 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
29270 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
29280 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
29290 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
292a0 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
292b0 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
292c0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
292d0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
292e0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
292f0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
29300 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
29310 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29320 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
29330 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29340 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
29350 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
29360 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
29370 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
29380 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
29390 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
293a0 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
293b0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
293c0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
293d0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
293e0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
293f0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
29400 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
29410 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
29420 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
29430 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
29440 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
29450 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
29460 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
29470 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
29480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29490 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
294a0 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
294b0 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
294c0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
294d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
294e0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
294f0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
29500 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
29510 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
29520 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
29530 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
29540 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
29550 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Cell..*/.static 
29560 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65  int clearCell(Me
29570 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e  mPage *pPage, un
29580 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
29590 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ll){.  BtShared 
295a0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
295b0 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
295c0 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
295d0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
295e0 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
295f0 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
29600 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
29610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
29620 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
29630 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
29640 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
29650 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
29660 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
29670 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ow==0 ){.    ret
29680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
29690 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
296a0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
296b0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
296c0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66  ing */.  }.  ovf
296d0 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  lPgno = get4byte
296e0 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
296f0 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65  erflow]);.  asse
29700 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
29710 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66  ize > 4 );.  ovf
29720 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
29730 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
29740 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
29750 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
29760 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
29770 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
29780 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
29790 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
297a0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
297b0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
297c0 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74  {.    Pgno iNext
297d0 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67   = 0;.    MemPag
297e0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
297f0 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32    if( ovflPgno<2
29800 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72   || ovflPgno>btr
29810 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
29820 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69   ){.      /* 0 i
29830 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61  s not a legal pa
29840 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
29850 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61  ge 1 cannot be a
29860 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  n .      ** over
29870 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65  flow page. There
29880 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f  fore if ovflPgno
29890 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65  <2 or past the e
298a0 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20  nd of the .     
298b0 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74   ** file the dat
298c0 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
298d0 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20  rrupt. */.      
298e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
298f0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29900 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20  }.    if( nOvfl 
29910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
29920 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
29930 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
29940 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20  vfl, &iNext);.  
29950 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
29960 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
29970 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c     if( ( pOvfl |
29980 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65  | ((pOvfl = btre
29990 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
299a0 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20   ovflPgno))!=0) 
299b0 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
299c0 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
299d0 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  nt(pOvfl->pDbPag
299e0 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20  e)!=1.    ){.   
299f0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
29a00 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72  o reason any cur
29a10 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20  sor should have 
29a20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  an outstanding r
29a30 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20  eference .      
29a40 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
29a50 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  w page belonging
29a60 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20   to a cell that 
29a70 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  is being deleted
29a80 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20  /updated..      
29a90 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20 65  ** So if there e
29aa0 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  xists more than 
29ab0 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
29ac0 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e   this page, then
29ad0 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75   it .      ** mu
29ae0 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  st not really be
29af0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
29b00 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
29b10 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
29b20 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74  pt. .      ** It
29b30 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64   is helpful to d
29b40 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f 72  etect this befor
29b50 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61  e calling freePa
29b60 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20  ge2(), as .     
29b70 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29 20   ** freePage2() 
29b80 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67  may zero the pag
29b90 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65  e contents if se
29ba0 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
29bb0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61   is.      ** ena
29bc0 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f  bled. If this 'o
29bd0 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61  verflow' page ha
29be0 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61  ppens to be a pa
29bf0 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ge that the.    
29c00 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69    ** caller is i
29c10 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
29c20 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d   or using in som
29c30 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  e other way, thi
29c40 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62  s.      ** can b
29c50 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20  e problematic.. 
29c60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
29c70 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
29c80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  T_BKPT;.    }els
29c90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
29ca0 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76  eePage2(pBt, pOv
29cb0 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  fl, ovflPgno);. 
29cc0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f     }..    if( pO
29cd0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  vfl ){.      sql
29ce0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
29cf0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
29d00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
29d10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29d20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65    ovflPgno = iNe
29d30 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
29d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29d50 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
29d60 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75 73  byte sequence us
29d70 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
29d80 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70  a cell on page p
29d90 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  Page.** and writ
29da0 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71 75  e that byte sequ
29db0 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b  ence into pCell[
29dc0 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67  ].  Overflow pag
29dd0 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  es are.** alloca
29de0 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69  ted and filled i
29df0 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20  n as necessary. 
29e00 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   The calling pro
29e10 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73  cedure.** is res
29e20 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b  ponsible for mak
29e30 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63 69  ing sure suffici
29e40 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62 65  ent space has be
29e50 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  en allocated.** 
29e60 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a  for pCell[]..**.
29e70 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65  ** Note that pCe
29e80 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65  ll does not nece
29e90 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f  ssary need to po
29ea0 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67 65  int to the pPage
29eb0 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e  ->aData.** area.
29ec0 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f    pCell might po
29ed0 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70  int to some temp
29ee0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20  orary storage.  
29ef0 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a  The cell will.**
29f00 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20   be constructed 
29f10 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72  in this temporar
29f20 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69  y area then copi
29f30 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ed into pPage->a
29f40 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a  Data.** later..*
29f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
29f60 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  lInCell(.  MemPa
29f70 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
29f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29f90 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
29fa0 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ins the cell */.
29fb0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
29fc0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
29fd0 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78   /* Complete tex
29fe0 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  t of the cell */
29ff0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2a000 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2a010 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
2a020 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44    const void *pD
2a030 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20  ata,int nData,  
2a040 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
2a050 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20    int nZero,    
2a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a070 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62   /* Extra zero b
2a080 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ytes to append t
2a090 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  o pData */.  int
2a0a0 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2a0c0 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
2a0d0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2a0e0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
2a0f0 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
2a100 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20  t nSrc, n, rc;. 
2a110 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a   int spaceLeft;.
2a120 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
2a130 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
2a140 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b  *pToRelease = 0;
2a150 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2a160 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69   *pPrior;.  unsi
2a170 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c  gned char *pPayl
2a180 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20  oad;.  BtShared 
2a190 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
2a1a0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76  t;.  Pgno pgnoOv
2a1b0 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48  fl = 0;.  int nH
2a1c0 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66  eader;.  CellInf
2a1d0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72  o info;..  asser
2a1e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a1f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a200 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2a210 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e  * pPage is not n
2a220 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65  ecessarily write
2a230 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c  able since pCell
2a240 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69   might be auxili
2a250 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ary.  ** buffer 
2a260 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65  space that is se
2a270 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20  parate from the 
2a280 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65  pPage buffer are
2a290 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  a */.  assert( p
2a2a0 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74  Cell<pPage->aDat
2a2b0 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61  a || pCell>=&pPa
2a2c0 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2a2d0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2a2e0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2a2f0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2a300 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2a310 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  );..  /* Fill in
2a320 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a   the header. */.
2a330 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20    nHeader = 0;. 
2a340 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2a350 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
2a360 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28   += 4;.  }.  if(
2a370 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
2a380 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2a390 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
2a3a0 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61  ll[nHeader], nDa
2a3b0 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c  ta+nZero);.  }el
2a3c0 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20  se{.    nData = 
2a3d0 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20  nZero = 0;.  }. 
2a3e0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2a3f0 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2a400 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2a410 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72  Key);.  btreePar
2a420 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
2a430 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
2a440 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2a450 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20  Header==nHeader 
2a460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66  );.  assert( inf
2a470 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
2a480 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
2a490 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74  Data==(u32)(nDat
2a4a0 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20  a+nZero) );.  . 
2a4b0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2a4c0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61  payload */.  nPa
2a4d0 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20  yload = nData + 
2a4e0 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61  nZero;.  if( pPa
2a4f0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2a500 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
2a510 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
2a520 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b  ;.    nData = 0;
2a530 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69  .  }else{ .    i
2a540 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78  f( NEVER(nKey>0x
2a550 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79  7fffffff || pKey
2a560 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ==0) ){.      re
2a570 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a580 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a590 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20      nPayload += 
2a5a0 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
2a5b0 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
2a5c0 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
2a5d0 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20  ;.  }.  *pnSize 
2a5e0 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20  = info.nSize;.  
2a5f0 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f  spaceLeft = info
2a600 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c  .nLocal;.  pPayl
2a610 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65  oad = &pCell[nHe
2a620 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20  ader];.  pPrior 
2a630 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
2a640 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69  verflow];..  whi
2a650 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29  le( nPayload>0 )
2a660 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c  {.    if( spaceL
2a670 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65  eft==0 ){.#ifnde
2a680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2a690 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
2a6a0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
2a6b0 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
2a6c0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2a6d0 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
2a6e0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
2a6f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a700 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
2a710 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
2a720 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
2a730 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
2a740 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
2a750 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
2a760 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
2a770 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a780 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
2a790 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2a7a0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2a7b0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2a7c0 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
2a7d0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
2a7e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a7f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2a800 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
2a810 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2a820 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
2a830 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
2a840 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
2a850 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
2a860 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
2a870 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
2a880 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
2a890 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
2a8a0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
2a8b0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
2a8c0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2a8d0 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
2a8e0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
2a8f0 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
2a900 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
2a910 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2a920 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
2a930 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
2a940 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
2a950 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
2a960 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
2a970 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
2a980 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
2a990 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
2a9a0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
2a9b0 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65  the uninitialise
2a9c0 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
2a9d0 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
2a9e0 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
2a9f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
2aa00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2aa10 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2aa20 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
2aa30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
2aa40 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
2aa50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
2aa60 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
2aa70 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
2aa80 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2aa90 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
2aaa0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
2aab0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
2aac0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2aad0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
2aae0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2aaf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2ab00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2ab10 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2ab20 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
2ab30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ab40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2ab50 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
2ab60 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
2ab70 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
2ab80 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
2ab90 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
2aba0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
2abb0 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
2abc0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
2abd0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
2abe0 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2abf0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2ac00 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ac10 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2ac20 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
2ac30 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
2ac40 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2ac50 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2ac60 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2ac70 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
2ac80 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2ac90 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
2aca0 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
2acb0 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
2acc0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2acd0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2ace0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2acf0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ad00 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ad10 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
2ad20 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
2ad30 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
2ad40 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2ad50 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
2ad60 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
2ad70 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
2ad80 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
2ad90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
2ada0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
2adb0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
2adc0 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
2add0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
2ade0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2adf0 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   4;.    }.    n 
2ae00 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
2ae10 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
2ae20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
2ae30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
2ae40 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
2ae50 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
2ae60 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
2ae70 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
2ae80 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
2ae90 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
2aea0 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
2aeb0 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
2aec0 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2aed0 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2aee0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2aef0 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2af00 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2af10 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
2af20 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2af30 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2af40 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2af50 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
2af60 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2af70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2af80 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
2af90 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
2afa0 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
2afb0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2afd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2afe0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2aff0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
2b000 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20  f( nSrc>0 ){.   
2b010 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20     if( n>nSrc ) 
2b020 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20  n = nSrc;.      
2b030 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a  assert( pSrc );.
2b040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
2b050 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
2b060 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b070 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
2b080 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
2b090 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
2b0a0 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  n;.    pPayload 
2b0b0 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
2b0c0 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
2b0d0 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
2b0e0 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
2b0f0 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSrc==0 ){.     
2b100 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
2b110 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74       pSrc = pDat
2b120 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
2b130 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
2b140 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
2b150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2b160 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2b170 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
2b180 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
2b190 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
2b1a0 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
2b1b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
2b1c0 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
2b1d0 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
2b1e0 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
2b1f0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2b200 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
2b210 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
2b220 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
2b230 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
2b240 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
2b250 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
2b260 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
2b270 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
2b280 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
2b290 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
2b2a0 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
2b2b0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2b2c0 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
2b2d0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
2b2e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 2f  nt i;          /
2b2f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2b300 2f 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  /.  u32 pc;     
2b310 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2b320 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
2b330 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
2b340 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
2b350 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
2b360 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
2b370 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
2b380 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
2b390 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
2b3a0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2b3b0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2b3c0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2b3d0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2b3e0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2b3f0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2b400 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2b410 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2b420 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2b430 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2b440 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2b450 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2b460 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2b470 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2b480 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2b490 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2b4a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2b4b0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2b4c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b4d0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b4e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2b4f0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2b500 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
2b510 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2b520 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
2b530 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2b540 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2b550 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2b560 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2b570 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b580 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2b590 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2b5a0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2b5b0 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2b5c0 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
2b5d0 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
2b5e0 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
2b5f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
2b600 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
2b610 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2b620 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2b630 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
2b640 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
2b650 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2b660 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2b670 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
2b680 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
2b690 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
2b6a0 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
2b6b0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
2b6c0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2b6d0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
2b6e0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
2b6f0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2b700 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2b710 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2b720 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   += 2;.}../*.** 
2b730 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
2b740 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
2b750 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
2b760 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
2b770 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
2b780 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
2b790 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
2b7a0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
2b7b0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
2b7c0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
2b7d0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
2b7e0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
2b7f0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
2b800 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
2b810 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
2b820 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
2b830 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
2b840 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
2b850 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
2b860 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
2b870 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
2b880 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
2b890 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
2b8a0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
2b8b0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
2b8c0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
2b8d0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
2b8e0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
2b8f0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
2b900 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
2b910 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
2b920 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
2b930 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
2b940 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
2b950 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
2b960 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
2b970 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
2b980 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
2b990 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
2b9a0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
2b9b0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
2b9c0 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
2b9d0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
2b9e0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
2b9f0 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
2ba00 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
2ba10 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
2ba20 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
2ba30 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
2ba40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
2ba50 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
2ba60 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
2ba70 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
2ba80 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
2ba90 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
2baa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
2bab0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
2bac0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
2bad0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
2bae0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
2baf0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
2bb00 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
2bb10 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
2bb20 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
2bb30 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
2bb40 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
2bb50 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
2bb60 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
2bb70 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
2bb80 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
2bb90 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
2bba0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
2bbb0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
2bbc0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
2bbd0 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
2bbe0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
2bbf0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
2bc00 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
2bc10 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
2bc20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
2bc30 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
2bc40 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
2bc50 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
2bc60 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2bc70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
2bc80 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f   end;          /
2bc90 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
2bca0 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20  t the last cell 
2bcb0 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b  pointer in data[
2bcc0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20  ] */.  int ins; 
2bcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2bce0 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72  x in data[] wher
2bcf0 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  e new cell point
2bd00 65 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a  er is inserted *
2bd10 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
2bd20 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73  et;   /* Address
2bd30 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70   of first cell p
2bd40 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2bd50 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2bd60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2bd70 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68  ontent of the wh
2bd80 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ole page */.  u8
2bd90 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20   *ptr;          
2bda0 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69  /* Used for movi
2bdb0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ng information a
2bdc0 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20  round in data[] 
2bdd0 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20  */..  int nSkip 
2bde0 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2bdf0 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2be00 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2be10 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2be20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2be30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2be40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2be50 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2be60 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2be70 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2be80 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2be90 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2bea0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2beb0 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2bec0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2bed0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2bee0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2bef0 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2bf00 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2bf10 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2bf20 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2bf30 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2bf40 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2bf50 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2bf60 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2bf70 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2bf80 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2bf90 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2bfa0 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2bfb0 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2bfc0 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2bfd0 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2bfe0 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2bff0 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2c000 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2c010 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2c020 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2c030 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2c040 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2c050 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2c060 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2c070 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2c080 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2c090 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2c0a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2c0b0 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2c0c0 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2c0d0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2c0e0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2c0f0 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2c100 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2c110 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2c120 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2c130 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2c140 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2c150 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2c160 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2c170 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2c180 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2c190 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2c1a0 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2c1b0 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2c1c0 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2c1d0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2c1e0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2c1f0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2c200 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2c210 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2c220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2c230 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2c240 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2c250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c260 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2c270 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2c280 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2c290 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c2a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2c2b0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2c2c0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2c2d0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2c2e0 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2c2f0 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2c300 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2c310 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2c320 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2c330 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2c340 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2c350 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2c360 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2c370 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2c380 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2c390 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2c3a0 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2c3b0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2c3c0 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2c3d0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2c3e0 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2c3f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2c400 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2c410 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2c420 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
2c430 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
2c440 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
2c450 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
2c460 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
2c470 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
2c480 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c  data[idx+nSkip],
2c490 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2c4a0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28  -nSkip);.    if(
2c4b0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2c4c0 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
2c4d0 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20  idx], iChild);. 
2c4e0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65     }.    for(j=e
2c4f0 6e 64 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  nd, ptr=&data[j]
2c500 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
2c510 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
2c520 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
2c530 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
2c540 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
2c550 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2c560 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
2c570 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2c580 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2c590 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2c5a0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2c5b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2c5c0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2c5d0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2c5e0 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2c5f0 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2c600 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2c610 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2c620 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2c630 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2c640 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2c650 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2c660 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2c670 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72      */.      ptr
2c680 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
2c690 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29  age, pCell, pRC)
2c6a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2c6b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
2c6c0 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20  a list of cells 
2c6d0 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  to a page.  The 
2c6e0 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69  page should be i
2c6f0 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a  nitially empty..
2c700 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65  ** The cells are
2c710 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66   guaranteed to f
2c720 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  it on the page..
2c730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2c740 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d  ssemblePage(.  M
2c750 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2c760 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2c770 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f  be assemblied */
2c780 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
2c790 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
2c7a0 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
2c7b0 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
2c7c0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2c7d0 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
2c7e0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
2c7f0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
2c800 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
2c810 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
2c820 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
2c830 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c840 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
2c850 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
2c860 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2c870 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
2c880 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
2c890 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
2c8a0 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
2c8b0 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
2c8c0 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
2c8d0 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
2c8e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
2c8f0 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
2c900 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
2c910 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
2c920 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
2c930 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2c940 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
2c950 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
2c960 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
2c970 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2c980 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
2c990 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
2c9a0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2c9b0 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
2c9c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c9d0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2c9e0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2c9f0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
2ca00 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d 58 5f  =0 && nCell<=MX_
2ca10 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2ca20 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67   && MX_CELL(pPag
2ca30 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29 3b  e->pBt)<=10921);
2ca40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ca50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2ca60 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2ca70 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  e) );..  /* Chec
2ca80 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2ca90 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a 65  has just been ze
2caa0 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67 65  roed by zeroPage
2cab0 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  () */.  assert( 
2cac0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2cad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2cae0 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
2caf0 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2cb00 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2cb10 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2cb20 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2cb30 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2cb40 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2cb50 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2cb60 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2cb70 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2cb80 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
2cb90 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
2cba0 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
2cbb0 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
2cbc0 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
2cbd0 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
2cbe0 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
2cbf0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2cc00 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
2cc10 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2cc20 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
2cc30 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2cc40 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
2cc50 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
2cc60 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2cc70 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
2cc80 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
2cc90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
2cca0 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
2ccb0 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
2ccc0 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
2ccd0 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
2cce0 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2ccf0 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
2cd00 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2cd10 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2cd20 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
2cd30 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2cd40 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2cd50 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
2cd60 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
2cd70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2cd80 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2cd90 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
2cda0 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
2cdb0 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
2cdc0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
2cdd0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
2cde0 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
2cdf0 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
2ce00 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
2ce10 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
2ce20 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
2ce30 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
2ce40 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
2ce50 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
2ce60 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
2ce70 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
2ce80 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
2ce90 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2cea0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
2ceb0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
2cec0 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
2ced0 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
2cee0 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
2cef0 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
2cf00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cf10 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2cf20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2cf30 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
2cf40 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
2cf50 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
2cf60 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
2cf70 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
2cf80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2cf90 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
2cfa0 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2cfb0 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
2cfc0 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
2cfd0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2cfe0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
2cff0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
2d000 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
2d010 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
2d020 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
2d030 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
2d040 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
2d050 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2d060 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
2d070 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
2d080 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
2d090 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63  trying to balanc
2d0a0 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f  e the 3 right-mo
2d0b0 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a  st leaf pages, j
2d0c0 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77  ust add.** a new
2d0d0 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67   page to the rig
2d0e0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64  ht-hand side and
2d0f0 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77   put the one new
2d100 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61   entry in.** tha
2d110 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65  t page.  This le
2d120 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73  aves the right s
2d130 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20  ide of the tree 
2d140 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61  somewhat.** unba
2d150 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64  lanced.  But odd
2d160 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69  s are that we wi
2d170 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20  ll be inserting 
2d180 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61  new entries.** a
2d190 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61  t the end soon a
2d1a0 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65  fterwards so the
2d1b0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61   nearly empty pa
2d1c0 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a  ge will quickly.
2d1d0 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20  ** fill up.  On 
2d1e0 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70  average..**.** p
2d1f0 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66  Page is the leaf
2d200 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74   page which is t
2d210 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61  he right-most pa
2d220 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a  ge in the tree..
2d230 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74  ** pParent is it
2d240 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65  s parent.  pPage
2d250 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e   must have a sin
2d260 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74  gle overflow ent
2d270 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61  ry.** which is a
2d280 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  lso the right-mo
2d290 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
2d2a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
2d2b0 70 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73  pSpace buffer is
2d2c0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
2d2d0 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20   temporary copy 
2d2e0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a  of the divider.*
2d2f0 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c  * cell that will
2d300 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
2d310 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20  o pParent. Such 
2d320 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
2d330 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70  of a 4.** byte p
2d340 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f  age number follo
2d350 77 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c  wed by a variabl
2d360 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2d370 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f  . In other.** wo
2d380 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20  rds, at most 13 
2d390 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65  bytes. Hence the
2d3a0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d   pSpace buffer m
2d3b0 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61  ust be at.** lea
2d3c0 73 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73  st 13 bytes in s
2d3d0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
2d3e0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
2d3f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2d400 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  t, MemPage *pPag
2d410 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a  e, u8 *pSpace){.
2d420 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73    BtShared *cons
2d430 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70  t pBt = pPage->p
2d440 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65  Bt;    /* B-Tree
2d450 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d   Database */.  M
2d460 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20  emPage *pNew;   
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
2d490 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2d4a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d4d0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  Code */.  Pgno p
2d4e0 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20  gnoNew;         
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d500 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
2d510 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65   pNew */..  asse
2d520 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2d530 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2d540 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d550 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d560 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d570 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2d580 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d590 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2d5a0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  1 );..  /* This 
2d5b0 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  error condition 
2d5c0 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
2d5d0 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
2d5e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
2d5f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
2d600 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  ell<=0 ) return 
2d610 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2d620 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
2d630 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
2d640 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
2d650 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
2d660 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
2d670 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
2d680 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
2d690 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
2d6a0 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2d6b0 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
2d6c0 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
2d6d0 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
2d6e0 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
2d6f0 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
2d700 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2d710 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2d720 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
2d730 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
2d740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
2d750 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
2d760 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
2d770 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
2d780 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2d790 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2d7a0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2d7b0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2d7c0 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2d7d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d7e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d7f0 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2d800 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d810 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2d820 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2d830 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2d840 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2d850 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2d860 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2d870 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2d880 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2d890 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2d8a0 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2d8b0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2d8c0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2d8d0 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2d8e0 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2d8f0 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2d900 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2d910 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2d920 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2d930 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2d940 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2d950 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2d960 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2d970 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2d980 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2d990 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2d9a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2d9b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2d9c0 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2d9d0 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2d9e0 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2d9f0 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2da00 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2da10 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2da20 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2da30 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2da40 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2da50 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2da60 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2da70 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2da80 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2da90 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2daa0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2dab0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2dac0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2dad0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2dae0 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
2daf0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2db00 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  ent->pgno, &rc);
2db10 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2db20 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2db30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d   ){.        ptrm
2db40 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65  apPutOvflPtr(pNe
2db50 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a  w, pCell, &rc);.
2db60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2db70 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2db80 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2db90 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2dba0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2dbb0 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2dbc0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2dbd0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2dbe0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2dbf0 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2dc00 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2dc10 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2dc20 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2dc30 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2dc40 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2dc50 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2dc60 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2dc70 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2dc80 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2dc90 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2dca0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2dcb0 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2dcc0 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2dcd0 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2dce0 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2dcf0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2dd00 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2dd10 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2dd20 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2dd30 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2dd40 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2dd50 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2dd60 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2dd70 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2dd80 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2dd90 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2dda0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2ddb0 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2ddc0 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2ddd0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2dde0 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2ddf0 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2de00 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2de10 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2de20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2de30 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2de40 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2de50 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2de60 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2de70 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2de80 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2de90 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2dea0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2deb0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2dec0 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2ded0 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2dee0 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2def0 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2df00 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2df10 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2df20 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2df30 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2df40 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2df50 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2df60 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  nt, pParent->nCe
2df70 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69 6e 74  ll, pSpace, (int
2df80 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 0a  )(pOut-pSpace),.
2df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2dfa0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 26  , pPage->pgno, &
2dfb0 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  rc);..    /* Set
2dfc0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2dfd0 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50 61 72   pointer of pPar
2dfe0 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ent to point to 
2dff0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f  the new page. */
2e000 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2e010 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2e020 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2e030 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b 0a 20  +8], pgnoNew);. 
2e040 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
2e050 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
2e060 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2e070 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  */.    releasePa
2e080 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ge(pNew);.  }.. 
2e090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
2e0a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2e0b0 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
2e0c0 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a   */..#if 0./*.**
2e0d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
2e0e0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
2e0f0 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  te anything to t
2e100 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  he operation of 
2e110 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20 69 73  SQLite..** it is
2e120 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74 69 76   sometimes activ
2e130 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69 6c 79  ated temporarily
2e140 20 77 68 69 6c 65 20 64 65 62 75 67 67 69 6e 67   while debugging
2e150 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69 62 6c   code responsibl
2e160 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74 69 6e  e .** for settin
2e170 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  g pointer-map en
2e180 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
2e190 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65 63 6b   int ptrmapCheck
2e1a0 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a 2a  Pages(MemPage **
2e1b0 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50 61 67  apPage, int nPag
2e1c0 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  e){.  int i, j;.
2e1d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 61    for(i=0; i<nPa
2e1e0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 67  ge; i++){.    Pg
2e1f0 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65 3b 0a  no n;.    u8 e;.
2e200 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2e210 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d 3b 0a  ge = apPage[i];.
2e220 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
2e230 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2e240 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e250 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
2e260 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 61    for(j=0; j<pPa
2e270 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b  ge->nCell; j++){
2e280 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  .      CellInfo 
2e290 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38 20 2a  info;.      u8 *
2e2a0 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 7a  z;.     .      z
2e2b0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2e2c0 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62 74 72  e, j);.      btr
2e2d0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
2e2e0 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b  Page, z, &info);
2e2f0 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e  .      if( info.
2e300 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
2e310 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d       Pgno ovfl =
2e320 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66   get4byte(&z[inf
2e330 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
2e340 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74         ptrmapGet
2e350 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20  (pBt, ovfl, &e, 
2e360 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2e370 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2e380 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2e390 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20  _OVERFLOW1 );.  
2e3a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e3b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e3c0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69          Pgno chi
2e3d0 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29  ld = get4byte(z)
2e3e0 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
2e3f0 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2e400 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2e410 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2e420 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2e430 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2e440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e450 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2e460 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
2e470 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2e480 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2e490 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2e4a0 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  ]);.      ptrmap
2e4b0 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20  Get(pBt, child, 
2e4c0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61  &e, &n);.      a
2e4d0 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2e4e0 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2e4f0 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2e500 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  }.  }.  return 1
2e510 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2e520 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e530 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20  is used to copy 
2e540 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e550 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20  the b-tree node 
2e560 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61  stored .** on pa
2e570 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65  ge pFrom to page
2e580 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46   pTo. If page pF
2e590 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65  rom was not a le
2e5a0 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a  af page, then.**
2e5b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2e5c0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63   entries for eac
2e5d0 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65  h child page are
2e5e0 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
2e5f0 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70   the.** parent p
2e600 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  age stored in th
2e610 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73  e pointer map is
2e620 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46   page pTo. If pF
2e630 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a  rom contained.**
2e640 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20   any cells with 
2e650 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  overflow page po
2e660 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65  inters, then the
2e670 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
2e680 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
2e690 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75  tries are also u
2e6a0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
2e6b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2e6c0 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a  s page pTo..**.*
2e6d0 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75  * If pFrom is cu
2e6e0 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67  rrently carrying
2e6f0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65   any overflow ce
2e700 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20  lls (entries in 
2e710 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  the.** MemPage.a
2e720 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74  Ovfl[] array), t
2e730 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69  hey are not copi
2e740 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a  ed to pTo. .**.*
2e750 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
2e760 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20  ng, page pTo is 
2e770 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73  reinitialized us
2e780 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50 61 67  ing btreeInitPag
2e790 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  e()..**.** The p
2e7a0 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 74 68  erformance of th
2e7b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
2e7c0 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49 74 20  ot critical. It 
2e7d0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
2e7e0 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63 65 5f  .** the balance_
2e7f0 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e 64 20  shallower() and 
2e800 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
2e810 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e 65 69   procedures, nei
2e820 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69 63 68  ther of.** which
2e830 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66 74 65   are called ofte
2e840 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c 20 63  n under normal c
2e850 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f  ircumstances..*/
2e860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 70  .static void cop
2e870 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d 65 6d  yNodeContent(Mem
2e880 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d  Page *pFrom, Mem
2e890 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74 20 2a  Page *pTo, int *
2e8a0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
2e8b0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
2e8c0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 20  .    BtShared * 
2e8d0 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
2e8e0 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38 20 2a  m->pBt;.    u8 *
2e8f0 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70   const aFrom = p
2e900 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 20  From->aData;.   
2e910 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54 6f 20   u8 * const aTo 
2e920 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a 20 20  = pTo->aData;.  
2e930 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46 72 6f    int const iFro
2e940 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e 68 64  mHdr = pFrom->hd
2e950 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69 6e 74  rOffset;.    int
2e960 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20 3d 20   const iToHdr = 
2e970 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20  ((pTo->pgno==1) 
2e980 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20 20 20  ? 100 : 0);.    
2e990 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
2e9a0 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20 20 20  iData;.  .  .   
2e9b0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
2e9c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 61 73  isInit );.    as
2e9d0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e 46 72  sert( pFrom->nFr
2e9e0 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a 20 20  ee>=iToHdr );.  
2e9f0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
2ea00 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2ea10 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61  dr+5])<=pBt->usa
2ea20 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20  bleSize );.  .  
2ea30 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d    /* Copy the b-
2ea40 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e  tree node conten
2ea50 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f  t from page pFro
2ea60 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a  m to page pTo. *
2ea70 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67 65  /.    iData = ge
2ea80 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
2ea90 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20  romHdr+5]);.    
2eaa0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74  memcpy(&aTo[iDat
2eab0 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61  a], &aFrom[iData
2eac0 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
2ead0 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d  ze-iData);.    m
2eae0 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64  emcpy(&aTo[iToHd
2eaf0 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  r], &aFrom[iFrom
2eb00 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c  Hdr], pFrom->cel
2eb10 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f  lOffset + 2*pFro
2eb20 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20  m->nCell);.  .  
2eb30 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a    /* Reinitializ
2eb40 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68  e page pTo so th
2eb50 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2eb60 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
2eb70 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20  tructure.    ** 
2eb80 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
2eb90 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
2eba0 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61  zation of pTo ca
2ebb0 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20  n actually fail 
2ebc0 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69  under.    ** fai
2ebd0 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72 63  rly obscure circ
2ebe0 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20  umstances, even 
2ebf0 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20 63  though it is a c
2ec00 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  opy of initializ
2ec10 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ed .    ** page 
2ec20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  pFrom..    */.  
2ec30 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20    pTo->isInit = 
2ec40 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  0;.    rc = btre
2ec50 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a  eInitPage(pTo);.
2ec60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2ec70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
2ec80 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
2ec90 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2eca0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2ecb0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2ecc0 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2ecd0 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  te the pointer-m
2ece0 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
2ecf0 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65  * for any b-tree
2ed00 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
2ed10 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20  es that pTo now 
2ed20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
2ed30 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f  nters to..    */
2ed40 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2ed50 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a  ACUUM ){.      *
2ed60 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74  pRC = setChildPt
2ed70 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20  rmaps(pTo);.    
2ed80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
2ed90 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
2eda0 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
2edb0 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
2edc0 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
2edd0 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
2ede0 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
2edf0 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
2ee00 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
2ee10 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
2ee20 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
2ee30 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
2ee40 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
2ee50 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
2ee60 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
2ee70 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
2ee80 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
2ee90 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
2eea0 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
2eeb0 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
2eec0 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
2eed0 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
2eee0 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
2eef0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
2ef00 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
2ef10 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
2ef20 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
2ef30 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
2ef40 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
2ef50 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
2ef60 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
2ef70 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
2ef80 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
2ef90 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
2efa0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2efb0 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
2efc0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
2efd0 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
2efe0 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
2eff0 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
2f000 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
2f010 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
2f020 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
2f030 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
2f040 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
2f050 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
2f060 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
2f070 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
2f080 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
2f090 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
2f0a0 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
2f0b0 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
2f0c0 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
2f0d0 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
2f0e0 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
2f0f0 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
2f100 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2f110 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
2f120 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
2f130 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2f140 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
2f150 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
2f160 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
2f170 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
2f180 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
2f190 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
2f1a0 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2f1b0 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
2f1c0 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
2f1d0 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
2f1e0 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2f1f0 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
2f200 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
2f210 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
2f220 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
2f230 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2f240 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
2f250 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
2f260 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2f270 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
2f280 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
2f290 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
2f2a0 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
2f2b0 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
2f2c0 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
2f2d0 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
2f2e0 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
2f2f0 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
2f300 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
2f310 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
2f320 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
2f330 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
2f340 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2f350 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
2f360 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
2f370 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
2f380 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
2f390 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2f3a0 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
2f3b0 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
2f3c0 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
2f3d0 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2f3e0 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66  old one page. If
2f3f0 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67   while inserting
2f400 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
2f410 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28  parent.** page (
2f420 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61 72  pParent) the par
2f430 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
2f440 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20   overfull, this 
2f450 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65  buffer is.** use
2f460 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70  d to store the p
2f470 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77  arent's overflow
2f480 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20   cells. Because 
2f490 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  this function in
2f4a0 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d  serts.** a maxim
2f4b0 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64  um of four divid
2f4c0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
2f4d0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61  e parent page, a
2f4e0 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a  nd the maximum.*
2f4f0 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * size of a cell
2f500 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61   stored within a
2f510 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
2f520 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74  is always less t
2f530 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68  han 1/4.** of th
2f540 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
2f550 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75   aOvflSpace[] bu
2f560 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74 65  ffer is guarante
2f570 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a  ed to be large.*
2f580 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c  * enough for all
2f590 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
2f5a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53  .**.** If aOvflS
2f5b0 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20 61  pace is set to a
2f5c0 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74   null pointer, t
2f5d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2f5e0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2f5f0 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
2f600 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e   int balance_non
2f610 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20  root(.  MemPage 
2f620 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20  *pParent,       
2f630 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e          /* Paren
2f640 74 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e  t page of siblin
2f650 67 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  gs being balance
2f660 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65  d */.  int iPare
2f670 6e 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  ntIdx,          
2f680 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f690 6f 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e  of "the page" in
2f6a0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38   pParent */.  u8
2f6b0 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20   *aOvflSpace,   
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f6d0 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
2f6e0 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61   of space for pa
2f6f0 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69  rent ovfl */.  i
2f700 6e 74 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20  nt isRoot       
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f720 2a 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e  * True if pParen
2f730 74 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65  t is a root-page
2f740 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
2f750 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
2f760 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
2f770 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
2f780 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f7a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
2f7b0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
2f7c0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
2f7d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2f7e0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
2f7f0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
2f800 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
2f810 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f830 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2f840 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
2f850 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f870 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2f880 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
2f890 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
2f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f8b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2f8c0 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8e0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
2f8f0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
2f900 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
2f910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f920 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
2f930 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
2f940 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
2f950 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
2f960 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
2f970 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
2f980 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
2f990 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2f9a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f9b0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
2f9c0 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
2f9d0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
2f9e0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
2f9f0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
2fa00 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
2fa10 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
2fa20 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
2fa30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2fa40 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
2fa50 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
2fa60 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
2fa70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
2fa80 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
2fa90 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
2faa0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
2fab0 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
2fac0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
2fad0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
2fae0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
2faf0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
2fb00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2fb10 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
2fb20 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
2fb30 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
2fb40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb50 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
2fb60 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
2fb70 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
2fb80 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
2fb90 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
2fba0 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
2fbb0 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
2fbc0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
2fbd0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
2fbe0 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
2fbf0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
2fc00 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
2fc10 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
2fc20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
2fc30 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
2fc40 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
2fc50 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
2fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc70 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
2fc80 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
2fc90 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
2fca0 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
2fcb0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
2fcc0 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
2fcd0 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
2fce0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
2fcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2fd00 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
2fd10 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
2fd20 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
2fd30 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
2fd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2fd50 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
2fd60 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
2fd70 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
2fd80 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
2fd90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2fda0 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
2fdb0 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
2fdc0 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
2fdd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
2fde0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2fdf0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
2fe00 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
2fe30 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
2fe40 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
2fe50 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
2fe60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
2fe70 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
2fe80 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
2fe90 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
2fea0 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
2feb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2fec0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2fed0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2fee0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2fef0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2ff00 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
2ff10 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
2ff20 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
2ff30 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
2ff40 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2ff50 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
2ff60 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
2ff70 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
2ff80 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
2ff90 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
2ffa0 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
2ffb0 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
2ffc0 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
2ffd0 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
2ffe0 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
2fff0 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
30000 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
30010 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
30020 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30030 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
30040 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
30050 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
30060 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
30070 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
30080 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
30090 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
300a0 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
300b0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
300c0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
300d0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
300e0 64 78 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29  dx==iParentIdx )
300f0 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53  ;..  if( !aOvflS
30100 70 61 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75  pace ){.    retu
30110 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
30120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
30130 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
30140 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c  s to balance. Al
30150 73 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65  so locate the ce
30160 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a  lls in pParent .
30170 20 20 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65    ** that divide
30180 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41   the siblings. A
30190 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
301a0 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62  e to find NN sib
301b0 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65  lings on .  ** e
301c0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
301d0 61 67 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e  age. More siblin
301e0 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f  gs are taken fro
301f0 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65  m one side, howe
30200 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68  ver, .  ** if th
30210 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
30220 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
30230 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
30240 2e 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a  . If pParent.  *
30250 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65  * has NB or fewe
30260 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20  r children then 
30270 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
30280 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65  pParent are take
30290 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
302a0 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72  his loop also dr
302b0 6f 70 73 20 74 68 65 20 64 69 76 69 64 65 72 20  ops the divider 
302c0 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70  cells from the p
302d0 61 72 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73  arent page. This
302e0 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72  .  ** way, the r
302f0 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
30300 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
30310 74 20 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77  t have to deal w
30320 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65  ith any.  ** ove
30330 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74  rflow cells in t
30340 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
30350 73 69 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69  since if any exi
30360 73 74 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20  sted they will. 
30370 20 2a 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79   ** have already
30380 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20   been removed.. 
30390 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e   */.  i = pParen
303a0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70  t->nOverflow + p
303b0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20  Parent->nCell;. 
303c0 20 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20   if( i<2 ){.    
303d0 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e  nxDiv = 0;.    n
303e0 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c  Old = i+1;.  }el
303f0 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33  se{.    nOld = 3
30400 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e  ;.    if( iParen
30410 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20  tIdx==0 ){      
30420 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
30430 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20    nxDiv = 0;.   
30440 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65   }else if( iPare
30450 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20  ntIdx==i ){.    
30460 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20    nxDiv = i-2;. 
30470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30480 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49  nxDiv = iParentI
30490 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  dx-1;.    }.    
304a0 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28  i = 2;.  }.  if(
304b0 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e   (i+nxDiv-pParen
304c0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70  t->nOverflow)==p
304d0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
304e0 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70  .    pRight = &p
304f0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
30500 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
30510 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +8];.  }else{.  
30520 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43    pRight = findC
30530 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
30540 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
30550 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20  verflow);.  }.  
30560 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
30570 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65  pRight);.  while
30580 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ( 1 ){.    rc = 
30590 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
305a0 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64  Bt, pgno, &apOld
305b0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
305c0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
305d0 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29  (apOld, 0, (i+1)
305e0 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a  *sizeof(MemPage*
305f0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  ));.      goto b
30600 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30610 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65      }.    nMaxCe
30620 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
30630 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
30640 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
30650 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29    if( (i--)==0 )
30660 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28   break;..    if(
30670 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e   i+nxDiv==pParen
30680 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20  t->aOvfl[0].idx 
30690 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  && pParent->nOve
306a0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61  rflow ){.      a
306b0 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e  pDiv[i] = pParen
306c0 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  t->aOvfl[0].pCel
306d0 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  l;.      pgno = 
306e0 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
306f0 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b  ]);.      szNew[
30700 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  i] = cellSizePtr
30710 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b  (pParent, apDiv[
30720 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  i]);.      pPare
30730 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  nt->nOverflow = 
30740 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
30750 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66      apDiv[i] = f
30760 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
30770 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
30780 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->nOverflow);.  
30790 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
307a0 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
307b0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
307c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
307d0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
307e0 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74  .      /* Drop t
307f0 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65  he cell from the
30800 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70   parent page. ap
30810 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69  Div[i] still poi
30820 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
30830 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
30840 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e  the parent, even
30850 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62   though it has b
30860 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20  een dropped..   
30870 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61     ** This is sa
30880 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70  fe because dropp
30890 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20  ing a cell only 
308a0 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66  overwrites the f
308b0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
308c0 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20  ur bytes of it, 
308d0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
308e0 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  n does not need 
308f0 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
30900 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66  ** four bytes of
30910 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
30920 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65  l. So the pointe
30930 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65  r is safe to use
30940 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20  .      ** later 
30950 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20  on.  .      **. 
30960 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 53       ** Unless S
30970 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
30980 64 20 69 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  d in secure-dele
30990 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73  te mode. In this
309a0 20 63 61 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20   case,.      ** 
309b0 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
309c0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
309d0 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
309e0 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
309f0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
30a00 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
30a10 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
30a20 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
30a30 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
30a40 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
30a50 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
30a60 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
30a70 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
30a80 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
30a90 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
30aa0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
30ab0 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a  secureDelete ){.
30ac0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
30ad0 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
30ae0 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d  _INT(apDiv[i]) -
30af0 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
30b00 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  NT(pParent->aDat
30b10 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  a);.        if( 
30b20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e  (iOff+szNew[i])>
30b30 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
30b40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
30b50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30b60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
30b80 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
30b90 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
30ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
30bb0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
30bc0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30bd0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
30be0 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66  &aOvflSpace[iOff
30bf0 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e  ], apDiv[i], szN
30c00 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ew[i]);.        
30c10 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f    apDiv[i] = &aO
30c20 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69  vflSpace[apDiv[i
30c30 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  ]-pParent->aData
30c40 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
30c50 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43     }.      dropC
30c60 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
30c70 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
30c80 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69  verflow, szNew[i
30c90 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  ], &rc);.    }. 
30ca0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d   }..  /* Make nM
30cb0 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70  axCells a multip
30cc0 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72  le of 4 in order
30cd0 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62   to preserve 8-b
30ce0 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65  yte.  ** alignme
30cf0 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c  nt */.  nMaxCell
30d00 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b  s = (nMaxCells +
30d10 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20   3)&~3;..  /*.  
30d20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** Allocate spac
30d30 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72  e for memory str
30d40 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b  uctures.  */.  k
30d50 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
30d60 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   + ROUND8(sizeof
30d70 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a  (MemPage));.  sz
30d80 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
30d90 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30da0 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
30db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30dc0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
30dd0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
30de0 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e00 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
30e10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20   pBt->pageSize  
30e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e40 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20  aSpace1 */.     
30e50 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20  + k*nOld;       
30e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e80 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70   Page copies (ap
30e90 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c  Copy) */.  apCel
30ea0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
30eb0 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
30ec0 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
30ed0 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
30ee0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
30ef0 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
30f00 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
30f10 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
30f20 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
30f30 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d  ls];.  aSpace1 =
30f40 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d   (u8*)&szCell[nM
30f50 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65  axCells];.  asse
30f60 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
30f70 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31  LIGNMENT(aSpace1
30f80 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
30f90 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f  Load pointers to
30fa0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69   all cells on si
30fb0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20  bling pages and 
30fc0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
30fd0 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20  s.  ** into the 
30fe0 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61  local apCell[] a
30ff0 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69  rray.  Make copi
31000 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65  es of the divide
31010 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74  r cells.  ** int
31020 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
31030 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20   from aSpace1[] 
31040 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74  and remove the t
31050 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73  he divider Cells
31060 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65  .  ** from pPare
31070 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  nt..  **.  ** If
31080 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
31090 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c  e on leaf pages,
310a0 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20   then the child 
310b0 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a  pointers of the.
310c0 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c    ** divider cel
310d0 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20  ls are stripped 
310e0 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62  from the cells b
310f0 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63  efore they are c
31100 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20  opied.  ** into 
31110 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74  aSpace1[].  In t
31120 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  his way, all cel
31130 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ls in apCell[] a
31140 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20  re without.  ** 
31150 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
31160 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65   If siblings are
31170 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
31180 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20  n all cell in.  
31190 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c  ** apCell[] incl
311a0 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  ude child pointe
311b0 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  rs.  Either way,
311c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
311d0 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20  Cell[].  ** are 
311e0 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  alike..  **.  **
311f0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a   leafCorrection:
31200 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20    4 if pPage is 
31210 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50  a leaf.  0 if pP
31220 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61  age is not a lea
31230 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65  f..  **       le
31240 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50  afData:  1 if pP
31250 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61  age holds key+da
31260 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68  ta and pParent h
31270 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a  olds only keys..
31280 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65    */.  leafCorre
31290 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d  ction = apOld[0]
312a0 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66  ->leaf*4;.  leaf
312b0 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  Data = apOld[0]-
312c0 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28  >hasData;.  for(
312d0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
312e0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74  ){.    int limit
312f0 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65  ;.    .    /* Be
31300 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
31310 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61  ing else, take a
31320 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74   copy of the i't
31330 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69  h original sibli
31340 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  ng.    ** The re
31350 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  st of this funct
31360 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74  ion will use dat
31370 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65  a from the copie
31380 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20  s rather.    ** 
31390 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61  that the origina
313a0 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68  l pages since th
313b0 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
313c0 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a   will be in the.
313d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f      ** process o
313e0 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  f being overwrit
313f0 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ten.  */.    Mem
31400 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
31410 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67  opy[i] = (MemPag
31420 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d  e*)&aSpace1[pBt-
31430 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d  >pageSize + k*i]
31440 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
31450 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a  d, apOld[i], siz
31460 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
31470 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d     pOld->aData =
31480 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d   (void*)&pOld[1]
31490 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c  ;.    memcpy(pOl
314a0 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b  d->aData, apOld[
314b0 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  i]->aData, pBt->
314c0 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20  pageSize);..    
314d0 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
314e0 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
314f0 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
31500 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
31510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
31520 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
31530 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
31540 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
31550 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
31560 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
31570 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
31580 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
31590 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
315a0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
315b0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
315c0 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
315d0 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
315e0 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
315f0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
31600 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
31610 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
31620 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
31630 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
31640 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
31650 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
31660 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
31670 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
31680 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
31690 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
316a0 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
316b0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
316c0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
316d0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
316e0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
316f0 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
31700 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
31710 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
31720 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
31730 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
31740 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
31750 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
31760 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
31770 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
31780 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
31790 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
317a0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
317b0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
317c0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
317d0 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
317e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
317f0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
31800 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
31810 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
31820 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
31830 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
31840 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
31850 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
31860 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
31870 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
31880 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
318a0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
318b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
318c0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
318d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
318e0 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
318f0 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
31900 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
31910 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
31920 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
31930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31940 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
31950 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
31960 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
31970 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31980 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
31990 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
319a0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
319b0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
319c0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
319d0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
319e0 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
319f0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
31a00 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
31a10 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
31a20 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
31a30 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
31a40 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
31a50 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
31a60 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
31a70 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
31a80 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
31a90 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
31aa0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
31ab0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
31ac0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
31ad0 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
31ae0 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
31af0 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
31b00 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
31b10 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
31b20 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
31b30 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
31b40 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
31b50 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
31b60 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
31b70 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
31b80 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
31b90 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
31ba0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
31bb0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
31bc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
31bd0 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
31be0 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
31bf0 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
31c00 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
31c10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
31c20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
31c30 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
31c40 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
31c50 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
31c60 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
31c70 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
31c80 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
31c90 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
31ca0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
31cb0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
31cc0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
31cd0 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
31ce0 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
31cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
31d00 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
31d10 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
31d20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
31d30 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
31d40 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
31d50 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
31d60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
31d70 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
31d80 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
31d90 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
31da0 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
31db0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
31dc0 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
31dd0 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
31de0 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
31df0 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
31e00 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
31e10 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
31e20 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
31e30 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
31e40 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
31e50 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
31e60 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
31e70 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
31e80 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
31e90 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
31ea0 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
31eb0 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
31ec0 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
31ed0 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
31ee0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
31ef0 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
31f00 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
31f10 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
31f20 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
31f30 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
31f40 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
31f50 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
31f60 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
31f70 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
31f80 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
31f90 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
31fa0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
31fb0 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
31fc0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
31fd0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
31fe0 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
31ff0 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
32000 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
32010 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
32020 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
32030 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
32040 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
32050 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
32060 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
32070 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
32080 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
32090 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
320a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
320b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
320c0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
320d0 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
320e0 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
320f0 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
32100 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
32110 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
32120 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
32130 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
32140 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
32150 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
32160 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
32170 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
32180 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
32190 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
321a0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
321b0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
321c0 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
321d0 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
321e0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
321f0 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
32200 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
32210 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
32220 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
32230 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
32240 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
32250 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
32260 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
32270 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
32280 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
32290 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
322a0 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
322b0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
322c0 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
322d0 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
322e0 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
322f0 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
32300 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
32310 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
32320 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
32330 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
32340 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
32350 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
32360 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
32370 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  0) );..  TRACE((
32380 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
32390 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20  d %d %d  ",.    
323a0 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apOld[0]->pgno, 
323b0 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61  .    nOld>=2 ? a
323c0 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[1]->pgno : 
323d0 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
323e0 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20   apOld[2]->pgno 
323f0 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a  : 0.  ));..  /*.
32400 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
32410 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
32420 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
32430 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
32440 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d  .  if( apOld[0]-
32450 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20  >pgno<=1 ){.    
32460 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32470 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
32480 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
32490 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
324a0 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
324b0 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
324c0 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
324d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
324e0 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
324f0 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
32500 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
32510 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
32520 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
32530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32540 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
32550 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
32560 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
32570 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
32580 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
32590 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
325a0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
325b0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
325c0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
325d0 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
325e0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
325f0 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
32600 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
32610 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
32620 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
32630 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
32640 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32650 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
32660 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
32670 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
32680 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
32690 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
326a0 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
326b0 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
326c0 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
326d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
326e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
326f0 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
32700 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
32710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
32720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
32730 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
32740 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
32750 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
32760 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
32770 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
32780 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
32790 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
327a0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
327b0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
327c0 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
327d0 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
327e0 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
327f0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
32800 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
32810 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
32820 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
32830 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
32840 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
32850 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
32860 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
32870 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
32880 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
32890 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
328a0 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
328b0 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
328c0 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
328d0 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
328e0 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
328f0 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
32900 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
32910 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
32920 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
32930 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
32940 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
32950 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
32960 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
32970 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
32980 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
32990 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
329a0 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
329b0 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
329c0 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
329d0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
329e0 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
329f0 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
32a00 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
32a10 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
32a20 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
32a30 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
32a40 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
32a50 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
32a60 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
32a70 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
32a80 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
32a90 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
32aa0 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
32ab0 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
32ac0 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
32ad0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
32ae0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
32af0 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e  nI>i ){.      in
32b00 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61  t t;.      MemPa
32b10 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20  ge *pT;.      t 
32b20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
32b30 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e  ;.      pT = apN
32b40 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e  ew[i];.      apN
32b50 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69  ew[i] = apNew[mi
32b60 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nI];.      apNew
32b70 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20  [minI] = pT;.   
32b80 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28   }.  }.  TRACE((
32b90 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28  "new: %d(%d) %d(
32ba0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
32bb0 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
32bc0 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c   apNew[0]->pgno,
32bd0 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e   szNew[0],.    n
32be0 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31  New>=2 ? apNew[1
32bf0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
32c00 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20  w>=2 ? szNew[1] 
32c10 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33  : 0,.    nNew>=3
32c20 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e   ? apNew[2]->pgn
32c30 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f  o : 0, nNew>=3 ?
32c40 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20   szNew[2] : 0,. 
32c50 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e     nNew>=4 ? apN
32c60 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[3]->pgno : 0,
32c70 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77   nNew>=4 ? szNew
32c80 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [3] : 0,.    nNe
32c90 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d  w>=5 ? apNew[4]-
32ca0 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
32cb0 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20  =5 ? szNew[4] : 
32cc0 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0));..  assert( 
32cd0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32ce0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
32cf0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70  >pDbPage) );.  p
32d00 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20  ut4byte(pRight, 
32d10 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70  apNew[nNew-1]->p
32d20 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  gno);..  /*.  **
32d30 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75   Evenly distribu
32d40 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61  te the data in a
32d50 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74  pCell[] across t
32d60 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  he new pages..  
32d70 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65  ** Insert divide
32d80 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61  r cells into pPa
32d90 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72  rent as necessar
32da0 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b  y..  */.  j = 0;
32db0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e  .  for(i=0; i<nN
32dc0 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a  ew; i++){.    /*
32dd0 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65   Assemble the ne
32de0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
32df0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
32e00 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b  pNew = apNew[i];
32e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e  .    assert( j<n
32e20 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
32e30 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
32e40 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61  ageFlags);.    a
32e50 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77  ssemblePage(pNew
32e60 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26  , cntNew[i]-j, &
32e70 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65  apCell[j], &szCe
32e80 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65  ll[j]);.    asse
32e90 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e  rt( pNew->nCell>
32ea0 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26  0 || (nNew==1 &&
32eb0 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29   cntNew[0]==0) )
32ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
32ed0 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ew->nOverflow==0
32ee0 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74   );..    j = cnt
32ef0 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
32f00 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
32f10 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
32f20 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
32f30 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
32f40 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
32f50 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
32f60 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
32f70 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32f80 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77    assert( i<nNew
32f90 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29  -1 || j==nCell )
32fa0 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c  ;.    if( j<nCel
32fb0 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  l ){.      u8 *p
32fc0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a  Cell;.      u8 *
32fd0 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74  pTemp;.      int
32fe0 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65   sz;..      asse
32ff0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
33000 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
33010 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   apCell[j];.    
33020 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d    sz = szCell[j]
33030 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
33040 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  n;.      pTemp =
33050 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76   &aOvflSpace[iOv
33060 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20  flSpace];.      
33070 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
33080 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
33090 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
330a0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
330b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
330c0 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
330d0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
330e0 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
330f0 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
33100 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
33110 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
33120 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
33130 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
33140 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
33150 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
33160 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
33170 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
33180 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
33190 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
331a0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
331b0 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
331c0 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
331d0 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
331e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
331f0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
33200 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
33210 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
33220 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
33230 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
33240 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
33250 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
33260 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
33270 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
33280 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
33290 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
332a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
332b0 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
332c0 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
332d0 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
332e0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
332f0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
33300 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
33310 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
33320 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
33330 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
33340 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
33350 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
33360 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
33370 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
33380 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
33390 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61   ** (see btreePa
333a0 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
333b0 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
333c0 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
333d0 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
333e0 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
333f0 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
33400 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
33410 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
33420 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
33430 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
33440 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
33450 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
33460 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
33470 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
33480 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
33490 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
334a0 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
334b0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
334c0 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
334d0 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
334e0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
334f0 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
33500 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
33510 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
33520 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33530 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
33540 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
33550 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
33560 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
33570 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
33580 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
33590 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
335a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
335b0 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a  iOvflSpace += sz
335c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
335d0 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  sz<=pBt->maxLoca
335e0 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73  l+23 );.      as
335f0 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65  sert( iOvflSpace
33600 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
33610 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43  );.      insertC
33620 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
33630 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
33640 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Temp, pNew->pgno
33650 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
33660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33670 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
33680 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
33690 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
336a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
336b0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
336c0 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
336d0 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
336e0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
336f0 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
33700 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
33710 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
33720 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
33730 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
33740 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
33750 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
33760 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
33770 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
33780 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
33790 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
337a0 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
337b0 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
337c0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
337d0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
337e0 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
337f0 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
33800 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
33810 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
33820 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
33830 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
33840 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
33850 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
33860 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
33870 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
33880 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
33890 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
338a0 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
338b0 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
338c0 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
338d0 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
338e0 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
338f0 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
33900 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
33910 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
33920 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
33930 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
33940 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
33950 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
33960 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
33970 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
33980 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
33990 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
339a0 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
339b0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
339c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
339d0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
339e0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
339f0 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
33a00 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
33a10 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
33a20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
33a30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
33a40 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
33a50 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
33a60 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
33a70 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
33a80 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
33a90 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
33aa0 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
33ab0 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
33ac0 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
33ad0 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
33ae0 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
33af0 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
33b00 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
33b10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33b20 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
33b30 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
33b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
33b50 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
33b60 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
33b70 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
33b80 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
33b90 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
33ba0 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
33bb0 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f  ) .    );.    co
33bc0 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
33bd0 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c  New[0], pParent,
33be0 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50   &rc);.    freeP
33bf0 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72  age(apNew[0], &r
33c00 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
33c10 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
33c20 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70      /* Fix the p
33c30 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
33c40 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63  es for all the c
33c50 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73  ells that were s
33c60 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a  hifted around. .
33c70 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
33c80 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
33c90 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e  nt types of poin
33ca0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
33cb0 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20  that need to.   
33cc0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
33cd0 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  h by this routin
33ce0 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65  e. Some of these
33cf0 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
33d00 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20  lready, but.    
33d10 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74  ** many have not
33d20 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
33d30 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20  is a summary:.  
33d40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29    **.    **   1)
33d50 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
33d60 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
33d70 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
33d80 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20  hat were not.   
33d90 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67   **      sibling
33da0 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  s when this func
33db0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
33dc0 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65   These have alre
33dd0 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ady.    **      
33de0 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e  been set. We don
33df0 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79  't need to worry
33e00 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69   about old sibli
33e10 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20  ngs that were.  
33e20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20    **      moved 
33e30 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
33e40 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28   - the freePage(
33e50 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e  ) code has taken
33e60 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   care.    **    
33e70 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20    of those..    
33e80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54  **.    **   2) T
33e90 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
33ea0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
33eb0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
33ec0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
33ed0 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
33ee0 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
33ef0 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
33f00 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
33f10 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se .    **      
33f20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
33f30 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
33f40 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
33f50 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
33f60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33     **.    **   3
33f70 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
33f80 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
33f90 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
33fa0 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20  child pages of. 
33fb0 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73     **      cells
33fc0 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73   stored on the s
33fd0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79  ibling pages may
33fe0 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
33ff0 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
34000 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73  **   4) If the s
34010 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
34020 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e   not internal in
34030 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e  tkey nodes, then
34040 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20   any.    **     
34050 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
34060 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65  used by these ce
34070 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  lls may need to 
34080 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a  be updated.    *
34090 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c  *      (internal
340a0 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65   intkey nodes ne
340b0 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  ver contain poin
340c0 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77  ters to overflow
340d0 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a   pages)..    **.
340e0 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74      **   5) If t
340f0 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
34100 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
34110 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
34120 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20  r-map.    **    
34130 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68    entries for th
34140 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61  e right-child pa
34150 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c  ges of each sibl
34160 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ing may need.   
34170 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75   **      to be u
34180 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
34190 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e     ** Cases 1 an
341a0 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69  d 2 are dealt wi
341b0 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65  th above by othe
341c0 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74  r code. The next
341d0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65  .    ** block de
341e0 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33  als with cases 3
341f0 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f   and 4 and the o
34200 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63  ne after that, c
34210 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20  ase 5. Since.   
34220 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f   ** setting a po
34230 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
34240 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20  is a relatively 
34250 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
34260 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a  ion, this.    **
34270 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20   code only sets 
34280 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
34290 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72  ies for child or
342a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
342b0 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a  that have.    **
342c0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20   actually moved 
342d0 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20  between pages.  
342e0 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
342f0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b  pNew = apNew[0];
34300 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
34310 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a  ld = apCopy[0];.
34320 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f      int nOverflo
34330 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
34340 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65  low;.    int iNe
34350 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43  xtOld = pOld->nC
34360 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b  ell + nOverflow;
34370 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c  .    int iOverfl
34380 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20  ow = (nOverflow 
34390 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  ? pOld->aOvfl[0]
343a0 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20  .idx : -1);.    
343b0 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
343c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343d0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
343e0 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
343f0 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
34420 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
34430 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
34440 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
34450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
34460 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
34470 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
34480 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
34490 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
344a0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
344b0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
344c0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
344d0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
344e0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
344f0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
34500 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
34510 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
34520 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
34530 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
34540 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
34550 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
34560 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
34570 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
34580 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
34590 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
345a0 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
345b0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
345c0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
345d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
345e0 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
345f0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
34600 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
34610 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
34620 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
34630 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
34640 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
34650 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
34660 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
34670 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
34680 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
34690 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
346a0 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
346b0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
346c0 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
346d0 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
346e0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
346f0 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
34700 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
34710 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
34720 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
34730 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
34740 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
34750 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
34760 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
34770 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
34780 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
34790 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
347a0 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
347b0 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
347c0 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
347d0 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
347e0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
347f0 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
34800 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
34810 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
34820 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
34830 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
34840 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
34850 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
34860 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
34870 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
34880 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
34890 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
348a0 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
348b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
348c0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
348d0 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
348e0 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
348f0 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
34900 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
34910 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
34920 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
34930 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
34940 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
34950 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
34960 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
34970 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
34980 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
34990 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
349a0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
349b0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
349c0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
349d0 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
349e0 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
349f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
34a00 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
34a10 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
34a20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
34a30 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
34a40 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
34a50 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
34a60 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
34a70 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
34a80 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
34a90 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
34aa0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
34ab0 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
34ac0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
34ad0 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
34ae0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
34af0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
34b00 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
34b10 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
34b20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
34b30 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
34b40 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
34b50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
34b60 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
34b70 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
34b80 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
34b90 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
34ba0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
34bb0 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
34bc0 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
34bd0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
34be0 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
34bf0 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
34c00 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
34c10 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
34c20 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
34c30 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
34c40 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
34c50 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
34c60 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
34c70 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
34c80 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
34c90 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
34ca0 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
34cb0 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
34cc0 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
34cd0 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
34ce0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
34cf0 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
34d00 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
34d10 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
34d20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
34d30 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
34d40 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
34d50 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
34d60 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
34d70 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
34d80 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
34d90 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
34da0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
34db0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
34dc0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
34dd0 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
34de0 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
34df0 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
34e00 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
34e10 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
34e20 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
34e30 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
34e40 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
34e50 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
34e60 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
34e70 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
34e80 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
34e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
34ea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
34eb0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
34ec0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
34ed0 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
34ee0 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
34ef0 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
34f00 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
34f10 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
34f20 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
34f30 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
34f40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
34f50 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
34f60 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
34f70 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
34f80 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
34f90 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
34fa0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
34fb0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
34fc0 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
34fd0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
34fe0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
34ff0 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
35000 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
35010 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
35020 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
35030 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35040 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
35050 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
35060 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
35070 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
35080 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
35090 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
350a0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
350b0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
350c0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
350d0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
350e0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
350f0 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
35100 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
35110 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
35120 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
35130 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
35140 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
35150 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
35160 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
35170 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
35180 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
35190 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
351a0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
351b0 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
351c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
351d0 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
351e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
351f0 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
35200 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
35210 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
35220 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
35230 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
35240 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
35250 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
35260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35270 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
35280 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
35290 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
352a0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
352b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
352c0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
352d0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
352e0 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  noChild = 0;    
352f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35300 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
35310 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
35320 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35330 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
35340 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
35350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
35360 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
35370 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35380 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35390 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
353a0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
353b0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
353c0 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
353d0 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
353e0 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
353f0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
35400 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
35410 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
35420 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
35430 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
35440 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
35450 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
35460 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
35470 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
35480 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
35490 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
354a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
354b0 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
354c0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
354d0 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68  ,&pChild,&pgnoCh
354e0 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  ild,pRoot->pgno,
354f0 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65  0);.    copyNode
35500 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70  Content(pRoot, p
35510 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20  Child, &rc);.   
35520 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
35530 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
35540 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68  pPut(pBt, pgnoCh
35550 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  ild, PTRMAP_BTRE
35560 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  E, pRoot->pgno, 
35570 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
35580 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35590 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  *ppChild = 0;.  
355a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
355b0 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
355c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
355d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
355e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
355f0 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
35600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35610 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35620 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
35630 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35640 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52  Child->nCell==pR
35650 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  oot->nCell );.. 
35660 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
35670 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
35680 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74  nto %d\n", pRoot
35690 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
356a0 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pgno));..  /* Co
356b0 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  py the overflow 
356c0 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74  cells from pRoot
356d0 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20   to pChild */.  
356e0 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
356f0 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76  Ovfl, pRoot->aOv
35700 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  fl, pRoot->nOver
35710 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f  flow*sizeof(pRoo
35720 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  t->aOvfl[0]));. 
35730 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
35740 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
35750 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
35760 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
35770 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
35780 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
35790 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
357a0 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
357b0 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
357c0 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
357d0 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
357e0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
357f0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
35800 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
35810 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
35820 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
35830 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
35840 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
35850 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
35860 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
35870 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
35880 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
35890 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
358a0 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
358b0 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
358c0 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
358d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
358e0 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
358f0 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
35900 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
35910 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
35920 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
35930 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
35940 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
35950 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
35960 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
35970 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
35980 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
35990 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
359a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
359b0 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
359c0 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
359d0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
359e0 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
359f0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
35a00 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
35a10 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
35a20 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
35a30 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
35a40 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
35a50 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
35a60 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
35a70 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
35a80 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
35a90 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
35aa0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
35ab0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
35ac0 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
35ad0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
35ae0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35af0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
35b00 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
35b10 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
35b20 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
35b30 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
35b40 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
35b50 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
35b60 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
35b70 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
35b80 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
35b90 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
35ba0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
35bb0 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
35bc0 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
35bd0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
35be0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
35bf0 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
35c00 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
35c10 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
35c20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
35c30 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
35c40 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
35c50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
35c60 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
35c70 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
35c80 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
35c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35ca0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
35cb0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
35cc0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
35cd0 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
35ce0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
35cf0 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
35d00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
35d10 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
35d20 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
35d30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
35d40 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
35d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
35d60 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
35d70 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
35d80 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
35d90 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
35da0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35db0 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
35dc0 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
35dd0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
35de0 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
35df0 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
35e00 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
35e10 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
35e20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
35e30 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
35e40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35e50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
35e60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35e70 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
35e80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
35e90 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
35ea0 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
35eb0 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
35ec0 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
35ed0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
35ee0 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
35ef0 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
35f00 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
35f10 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
35f20 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
35f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
35f40 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
35f50 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
35f60 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
35f70 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
35f80 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
35f90 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
35fa0 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
35fb0 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
35fc0 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
35fd0 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
35fe0 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
35ff0 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
36000 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
36010 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
36020 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
36030 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
36040 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
36050 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
36060 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
36070 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
36080 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
36090 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
360a0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
360b0 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
360c0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
360d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
360e0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
360f0 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
36100 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
36110 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
36120 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
36130 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
36140 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
36150 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
36160 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
36170 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
36180 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
36190 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
361a0 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
361b0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
361c0 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
361d0 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
361e0 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
361f0 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
36200 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
36210 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
36220 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
36230 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
36240 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
36250 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
36260 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
36270 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
36280 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
36290 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
362a0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
362b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
362c0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
362d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
362e0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
362f0 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
36300 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
36310 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
36320 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
36330 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
36340 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
36350 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
36360 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
36370 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
36380 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
36390 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
363a0 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
363b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
363c0 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
363d0 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
363e0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
363f0 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
36400 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
36410 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
36420 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
36430 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
36440 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
36450 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
36460 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
36470 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
36480 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
36490 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
364a0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
364b0 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
364c0 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
364d0 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
364e0 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
364f0 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
36500 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
36510 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
36520 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
36530 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
36540 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
36550 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
36560 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
36570 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
36580 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
36590 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
365a0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
365b0 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
365c0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
365d0 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
365e0 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
365f0 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
36600 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
36610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
36620 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
36630 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
36640 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
36650 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
36660 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
36670 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
36680 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
36690 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
366a0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
366b0 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
366c0 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
366d0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
366e0 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
366f0 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
36700 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
36710 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
36720 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
36730 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
36740 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
36750 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
36760 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
36770 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
36780 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
36790 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
367a0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
367b0 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
367c0 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
367d0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
367e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
367f0 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
36800 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
36810 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
36820 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
36830 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
36840 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
36850 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
36860 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
36870 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
36880 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
36890 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
368a0 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
368b0 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
368c0 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
368d0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
368e0 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
368f0 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
36900 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
36910 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
36920 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
36930 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
36940 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
36950 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
36960 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
36970 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
36980 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
36990 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
369a0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
369b0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
369c0 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
369d0 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
369e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
369f0 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
36a00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
36a10 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
36a20 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  erflow = 0;..   
36a30 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69     /* The next i
36a40 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
36a50 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73  do-loop balances
36a60 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
36a70 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61  . */.      relea
36a80 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
36a90 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
36aa0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  --;.    }.  }whi
36ab0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
36ac0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65  K );..  if( pFre
36ad0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
36ae0 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
36af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
36b00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  ;.}.../*.** Inse
36b10 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
36b20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
36b30 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
36b40 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
36b50 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
36b60 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
36b70 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
36b80 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
36b90 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
36ba0 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
36bb0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
36bc0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
36bd0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
36be0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
36bf0 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
36c00 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
36c10 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
36c20 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
36c30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
36c40 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
36c50 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
36c60 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
36c70 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
36c80 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
36c90 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
36ca0 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
36cb0 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
36cc0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
36cd0 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
36ce0 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e  l to.** MovetoUn
36cf0 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b  packed() to seek
36d00 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20   cursor pCur to 
36d10 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73  (pKey, nKey) has
36d20 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
36d30 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b   performed. seek
36d40 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65  Result is the se
36d50 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75  arch result retu
36d60 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65  rned (a negative
36d70 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43  .** number if pC
36d80 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
36d90 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d  entry that is sm
36da0 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79  aller than (pKey
36db0 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61  , nKey), or.** a
36dc0 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
36dd0 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
36de0 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69  t an etry that i
36df0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a  s larger than .*
36e00 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e  * (pKey, nKey)).
36e10 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
36e20 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
36e30 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
36e40 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
36e50 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
36e60 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20  .** cursor pCur 
36e70 69 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  is pointing at t
36e80 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79  he existing copy
36e90 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69   of a row that i
36ea0 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77  s to be.** overw
36eb0 72 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20  ritten.  If the 
36ec0 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
36ed0 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
36ee0 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a  cursor pCur may.
36ef0 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  ** point to any 
36f00 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65  entry or to no e
36f10 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20  ntry at all and 
36f20 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  so this function
36f30 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20   has to seek.** 
36f40 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72  the cursor befor
36f50 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61  e the new key ca
36f60 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  n be inserted..*
36f70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
36f80 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
36f90 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
36fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
36fb0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
36fc0 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
36fd0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
36fe0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
36ff0 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
37000 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
37010 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
37020 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
37030 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
37040 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
37050 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
37060 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37080 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
37090 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
370a0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
370b0 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c   int appendBias,
370c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370d0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
370e0 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
370f0 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  end */.  int see
37100 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  kResult         
37110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
37120 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74  t of prior Movet
37130 6f 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c  oUnpacked() call
37140 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
37150 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65  .  int loc = see
37160 6b 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  kResult;        
37170 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20    /* -1: before 
37180 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e  desired location
37190 20 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20    +1: after */. 
371a0 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a   int szNew = 0;.
371b0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
371c0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
371d0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
371e0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
371f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
37200 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
37210 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
37220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
37230 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Cell = 0;..  if(
37240 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
37250 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
37260 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
37270 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
37280 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 65 74 75  E_OK );.    retu
37290 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
372a0 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  t;.  }..  assert
372b0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
372c0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
372d0 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
372e0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
372f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
37300 57 52 49 54 45 20 26 26 20 21 70 42 74 2d 3e 72  WRITE && !pBt->r
37310 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73  eadOnly );.  ass
37320 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
37330 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
37340 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
37350 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d  pCur->pKeyInfo!=
37360 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 41  0, 2) );..  /* A
37370 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63  ssert that the c
37380 61 6c 6c 65 72 20 68 61 73 20 62 65 65 6e 20 63  aller has been c
37390 6f 6e 73 69 73 74 65 6e 74 2e 20 49 66 20 74 68  onsistent. If th
373a0 69 73 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  is cursor was op
373b0 65 6e 65 64 0a 20 20 2a 2a 20 65 78 70 65 63 74  ened.  ** expect
373c0 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 62 2d 74  ing an index b-t
373d0 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ree, then the ca
373e0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69  ller should be i
373f0 6e 73 65 72 74 69 6e 67 20 62 6c 6f 62 0a 20 20  nserting blob.  
37400 2a 2a 20 6b 65 79 73 20 77 69 74 68 20 6e 6f 20  ** keys with no 
37410 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 2e  associated data.
37420 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 77   If the cursor w
37430 61 73 20 6f 70 65 6e 65 64 20 65 78 70 65 63 74  as opened expect
37440 69 6e 67 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 6b  ing an.  ** intk
37450 65 79 20 74 61 62 6c 65 2c 20 74 68 65 20 63 61  ey table, the ca
37460 6c 6c 65 72 20 73 68 6f 75 6c 64 20 62 65 20 69  ller should be i
37470 6e 73 65 72 74 69 6e 67 20 69 6e 74 65 67 65 72  nserting integer
37480 20 6b 65 79 73 20 77 69 74 68 20 61 0a 20 20 2a   keys with a.  *
37490 2a 20 62 6c 6f 62 20 6f 66 20 61 73 73 6f 63 69  * blob of associ
374a0 61 74 65 64 20 64 61 74 61 2e 20 20 2a 2f 0a 20  ated data.  */. 
374b0 20 61 73 73 65 72 74 28 20 28 70 4b 65 79 3d 3d   assert( (pKey==
374c0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
374d0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
374e0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
374f0 6e 73 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62  nsert into a tab
37500 6c 65 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c  le b-tree, inval
37510 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c  idate any incrbl
37520 6f 62 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73  ob .  ** cursors
37530 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77   open on the row
37540 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
37550 28 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69  (assuming this i
37560 73 20 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  s a replace.  **
37570 20 6f 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20   operation - if 
37580 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66  it is not, the f
37590 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
375a0 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  -op).  */.  if( 
375b0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
375c0 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  0 ){.    invalid
375d0 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
375e0 72 73 28 70 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a  rs(p, nKey, 0);.
375f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74    }..  /* Save t
37600 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
37610 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72  any other cursor
37620 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74  s open on this t
37630 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
37640 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
37650 68 65 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  he call to btree
37660 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
37670 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
37680 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
37690 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
376a0 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
376b0 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
376c0 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
376d0 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
376e0 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
376f0 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
37700 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
37710 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
37720 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
37730 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
37740 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
37750 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
37760 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
37770 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
37780 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 74   In this case bt
37790 72 65 65 4d 6f 76 65 74 6f 28 29 20 72 65 63 6f  reeMoveto() reco
377a0 67 6e 69 7a 65 73 0a 20 20 2a 2a 20 74 68 61 74  gnizes.  ** that
377b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
377c0 6c 72 65 61 64 79 20 77 68 65 72 65 20 69 74 20  lready where it 
377d0 6e 65 65 64 73 20 74 6f 20 62 65 20 61 6e 64 20  needs to be and 
377e0 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 0a  returns without.
377f0 20 20 2a 2a 20 64 6f 69 6e 67 20 61 6e 79 20 77    ** doing any w
37800 6f 72 6b 2e 20 54 6f 20 61 76 6f 69 64 20 74 68  ork. To avoid th
37810 77 61 72 74 69 6e 67 20 74 68 65 73 65 20 6f 70  warting these op
37820 74 69 6d 69 7a 61 74 69 6f 6e 73 2c 20 69 74 20  timizations, it 
37830 69 73 20 69 6d 70 6f 72 74 61 6e 74 0a 20 20 2a  is important.  *
37840 2a 20 6e 6f 74 20 74 6f 20 63 6c 65 61 72 20 74  * not to clear t
37850 68 65 20 63 75 72 73 6f 72 20 68 65 72 65 2e 0a  he cursor here..
37860 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 61 76 65    */.  rc = save
37870 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
37880 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
37890 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
378a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
378b0 66 28 20 21 6c 6f 63 20 29 7b 0a 20 20 20 20 72  f( !loc ){.    r
378c0 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  c = btreeMoveto(
378d0 70 43 75 72 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  pCur, pKey, nKey
378e0 2c 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c  , appendBias, &l
378f0 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  oc);.    if( rc 
37900 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37910 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
37920 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
37930 56 41 4c 49 44 20 7c 7c 20 28 70 43 75 72 2d 3e  VALID || (pCur->
37940 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
37950 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63 29 20 29  NVALID && loc) )
37960 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
37970 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
37980 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
37990 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
379a0 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20  || nKey>=0 );.  
379b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
379c0 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69  eaf || !pPage->i
379d0 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 54 52 41 43  ntKey );..  TRAC
379e0 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
379f0 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
37a00 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
37a10 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
37a20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
37a30 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
37a40 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
37a50 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
37a60 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
37a70 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
37a80 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
37a90 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65  it );.  allocate
37aa0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
37ab0 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d    newCell = pBt-
37ac0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66  >pTmpSpace;.  if
37ad0 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
37ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
37af0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
37b00 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
37b10 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
37b20 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
37b30 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
37b40 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
37b50 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
37b60 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
37b70 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
37b80 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
37b90 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
37ba0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
37bb0 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  ;.  idx = pCur->
37bc0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
37bd0 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30  e];.  if( loc==0
37be0 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c   ){.    u16 szOl
37bf0 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  d;.    assert( i
37c00 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
37c10 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
37c20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
37c30 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
37c40 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37c50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
37c60 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
37c70 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
37c80 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
37c90 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
37ca0 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
37cb0 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
37cc0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
37cd0 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
37ce0 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
37cf0 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
37d00 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
37d10 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
37d20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
37d30 69 64 78 2c 20 73 7a 4f 6c 64 2c 20 26 72 63 29  idx, szOld, &rc)
37d40 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
37d50 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
37d60 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c    }else if( loc<
37d70 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c  0 && pPage->nCel
37d80 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  l>0 ){.    asser
37d90 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  t( pPage->leaf )
37da0 3b 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43  ;.    idx = ++pC
37db0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
37dc0 69 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b  iPage];.  }else{
37dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
37de0 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a  ge->leaf );.  }.
37df0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
37e00 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ge, idx, newCell
37e10 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 2c 20 26  , szNew, 0, 0, &
37e20 72 63 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rc);.  assert( r
37e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
37e40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
37e50 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
37e60 6f 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ow>0 );..  /* If
37e70 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63   no error has oc
37e80 63 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20  cured and pPage 
37e90 68 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  has an overflow 
37ea0 63 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e  cell, call balan
37eb0 63 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65  ce() .  ** to re
37ec0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63  distribute the c
37ed0 65 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20  ells within the 
37ee0 74 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61  tree. Since bala
37ef0 6e 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20  nce() may move. 
37f00 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20   ** the cursor, 
37f10 7a 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f  zero the BtCurso
37f20 72 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64  r.info.nSize and
37f30 20 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e   BtCursor.validN
37f40 4b 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  Key.  ** variabl
37f50 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72  es..  **.  ** Pr
37f60 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
37f70 6f 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64  of SQLite called
37f80 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f   moveToRoot() to
37f90 20 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   move the cursor
37fa0 0a 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68  .  ** back to th
37fb0 65 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62  e root page as b
37fc0 61 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f  alance() used to
37fd0 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
37fe0 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
37ff0 20 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65   BtCursor.apPage
38000 5b 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  [] and BtCursor.
38010 61 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64  aiIdx[]. Instead
38020 20 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a   of doing that,.
38030 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72    ** set the cur
38040 73 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e  sor state to "in
38050 76 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b  valid". This mak
38060 65 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74  es common insert
38070 20 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a   operations.  **
38080 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
38090 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72  ..  **.  ** Ther
380a0 65 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75  e is a subtle bu
380b0 74 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69  t important opti
380c0 6d 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f  mization here to
380d0 6f 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e  o. When insertin
380e0 67 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20  g.  ** multiple 
380f0 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20  records into an 
38100 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73  intkey b-tree us
38110 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72  ing a single cur
38120 73 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a  sor (as can.  **
38130 20 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72   happen while pr
38140 6f 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53  ocessing an "INS
38150 45 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c  ERT INTO ... SEL
38160 45 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c  ECT" statement),
38170 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61   it.  ** is adva
38180 6e 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76  ntageous to leav
38190 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  e the cursor poi
381a0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
381b0 74 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  t entry in.  ** 
381c0 74 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f  the b-tree if po
381d0 73 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63  ssible. If the c
381e0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
381f0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
38200 73 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e  st.  ** entry in
38210 20 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20   the table, and 
38220 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73  the next row ins
38230 65 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74  erted has an int
38240 65 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61  eger key.  ** la
38250 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
38260 72 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b  rgest existing k
38270 65 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  ey, it is possib
38280 6c 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  le to insert the
38290 0a 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75  .  ** row withou
382a0 74 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75  t seeking the cu
382b0 72 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62  rsor. This can b
382c0 65 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61  e a big performa
382d0 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a  nce boost..  */.
382e0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
382f0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
38300 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
38310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
38320 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
38330 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63  erflow ){.    rc
38340 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
38350 3b 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d  ;..    /* Must m
38360 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c  ake sure nOverfl
38370 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a  ow is reset to z
38380 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20  ero even if the 
38390 62 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a  balance().    **
383a0 20 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c   fails. Internal
383b0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
383c0 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
383d0 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65  result otherwise
383e0 2e 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  . .    ** Also, 
383f0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
38400 74 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e  tate to invalid.
38410 20 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65   This stops save
38420 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
38430 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79  .    ** from try
38440 69 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20  ing to save the 
38450 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
38460 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
38470 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70   */.    pCur->ap
38480 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
38490 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  ]->nOverflow = 0
384a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.