/ Hex Artifact Content
Login

Artifact 960274cb93c1d85e82bd106094e0890d89434ab8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0910: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0920: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0930: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0940: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0950: 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ....#ifdef SQLIT
0960: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
0970: 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  CHE.  /*.  ** Th
0980: 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72  e functions quer
0990: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09a0: 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72  eLock(), setShar
09b0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
09c0: 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65  (),.  ** and cle
09d0: 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
09e0: 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a  TableLocks().  *
09f0: 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74  * manipulate ent
0a00: 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53 68  ries in the BtSh
0a10: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65  ared.pLock linke
0a20: 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73  d list used to s
0a30: 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64  tore.  ** shared
0a40: 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76  -cache table lev
0a50: 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65  el locks. If the
0a60: 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70   library is comp
0a70: 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  iled with the.  
0a80: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0a90: 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65 64  feature disabled
0aa0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
0ab0: 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73  only ever one us
0ac0: 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20  er.  ** of each 
0ad0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
0ae0: 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c  re and so this l
0af0: 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65  ocking is not ne
0b00: 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53  cessary. .  ** S
0b10: 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63  o define the loc
0b20: 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69  k related functi
0b30: 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20  ons as no-ops.. 
0b40: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75   */.  #define qu
0b50: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
0b60: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53  bleLock(a,b,c) S
0b70: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
0b80: 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ne setSharedCach
0b90: 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63  eTableLock(a,b,c
0ba0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
0bb0: 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68  efine clearAllSh
0bc0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0bd0: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0be0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
0bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0c00: 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65 20  ks(a).  #define 
0c10: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
0c20: 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64 29  bleLock(a,b,c,d)
0c30: 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61 73   1.  #define has
0c40: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61 2c  ReadConflicts(a,
0c50: 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69   b) 0.#endif..#i
0c60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0c70: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a  T_SHARED_CACHE..
0c80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0c90: 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73  BUG./*.**** This
0ca0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
0cb0: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
0cc0: 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  f an assert() st
0cd0: 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a  atement. ***.**.
0ce0: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0cf0: 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20  if pBtree holds 
0d00: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
0d10: 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ks to read or wr
0d20: 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74  ite to the .** t
0d30: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70  able with root p
0d40: 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74  age iRoot.   Ret
0d50: 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73  urn 1 if it does
0d60: 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a   and 0 if not..*
0d70: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
0d80: 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  , when writing t
0d90: 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 72  o a table with r
0da0: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76  oot-page iRoot v
0db0: 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e  ia .** Btree con
0dc0: 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a  nection pBtree:.
0dd0: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
0de0: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0df0: 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c  ableLock(pBtree,
0e00: 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45   iRoot, 0, WRITE
0e10: 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  _LOCK) );.**.** 
0e20: 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  When writing to 
0e30: 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72 65  an index that re
0e40: 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72 61  sides in a shara
0e50: 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ble database, th
0e60: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
0e70: 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20 6f  uld have first o
0e80: 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73  btained a lock s
0e90: 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f  pecifying the ro
0ea0: 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  ot page of.** th
0eb0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0ec0: 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65  table. This make
0ed0: 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d  s things a bit m
0ee0: 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c  ore complicated,
0ef0: 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75  .** as this modu
0f00: 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20 74  le treats each t
0f10: 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72 61  able as a separa
0f20: 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f  te structure. To
0f30: 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68   determine.** th
0f40: 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f  e table correspo
0f50: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64  nding to the ind
0f60: 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ex being written
0f70: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0f80: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0f90: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0fa0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0fb0: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0fc0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62   lock on the tab
0fd0: 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20  le/index rooted 
0fe0: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74  at page iRoot, t
0ff0: 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a  he caller may.**
1000: 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f   hold a write-lo
1010: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1020: 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67   table (root pag
1030: 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c  e 1). This is al
1040: 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65  so.** acceptable
1050: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1060: 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1070: 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65  bleLock(.  Btree
1080: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
1090: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74    /* Handle that
10a0: 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20   must hold lock 
10b0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  */.  Pgno iRoot,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10d0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72  oot page of b-tr
10e0: 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e  ee */.  int isIn
10f0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
1100: 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20  * True if iRoot 
1110: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61  is the root of a
1120: 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a  n index b-tree *
1130: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70  /.  int eLockTyp
1140: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  e          /* Re
1150: 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65  quired lock type
1160: 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57   (READ_LOCK or W
1170: 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b  RITE_LOCK) */.){
1180: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
1190: 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70  ma = (Schema *)p
11a0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68  Btree->pBt->pSch
11b0: 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62  ema;.  Pgno iTab
11c0: 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a   = 0;.  BtLock *
11d0: 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20  pLock;..  /* If 
11e0: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
11f0: 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20   not shareable, 
1200: 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74  or if the client
1210: 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a   is reading.  **
1220: 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65 61   and has the rea
1230: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
1240: 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20  ag set, then no 
1250: 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  lock is required
1260: 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74  . .  ** Return t
1270: 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  rue immediately.
1280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  .  */.  if( (pBt
1290: 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30  ree->sharable==0
12a0: 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79  ).   || (eLockTy
12b0: 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26  pe==READ_LOCK &&
12c0: 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c   (pBtree->db->fl
12d0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
12e0: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a 20  dUncommitted)). 
12f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1300: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1310: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1320: 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e 67  ding  or writing
1330: 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74 68   an index and th
1340: 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a 2a  e schema is.  **
1350: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1360: 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66  n it is too diff
1370: 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c 6c  icult to actuall
1380: 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  y check to see i
1390: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72 65  f.  ** the corre
13a0: 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c  ct locks are hel
13b0: 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62 6f  d.  So do not bo
13c0: 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  ther - just retu
13d0: 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54 68  rn true..  ** Th
13e0: 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f 74  is case does not
13f0: 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f 66   come up very of
1400: 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ten anyhow..  */
1410: 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 26  .  if( isIndex &
1420: 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20 28  & (!pSchema || (
1430: 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 26 44  pSchema->flags&D
1440: 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d  B_SchemaLoaded)=
1450: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
1460: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  n 1;.  }..  /* F
1470: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f  igure out the ro
1480: 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65  ot-page that the
1490: 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20   lock should be 
14a0: 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62  held on. For tab
14b0: 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c  le.  ** b-trees,
14c0: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68   this is just th
14d0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
14e0: 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  he b-tree being 
14f0: 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69  read or.  ** wri
1500: 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20  tten. For index 
1510: 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74  b-trees, it is t
1520: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1530: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
1540: 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20   ** table.  */. 
1550: 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a   if( isIndex ){.
1560: 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b      HashElem *p;
1570: 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74  .    for(p=sqlit
1580: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
1590: 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70  ema->idxHash); p
15a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
15b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e  xt(p)){.      In
15c0: 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64  dex *pIdx = (Ind
15d0: 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ex *)sqliteHashD
15e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66  ata(p);.      if
15f0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69  ( pIdx->tnum==(i
1600: 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20  nt)iRoot ){.    
1610: 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d      iTab = pIdx-
1620: 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20  >pTable->tnum;. 
1630: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1640: 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d  else{.    iTab =
1650: 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f   iRoot;.  }..  /
1660: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
1670: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1680: 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c  Either a write-l
1690: 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65  ock on root-page
16a0: 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77   iTab, a .  ** w
16b0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
16c0: 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f   schema table, o
16d0: 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74  r (if the client
16e0: 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20   is reading) a. 
16f0: 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   ** read-lock on
1700: 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69   iTab will suffi
1710: 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20  ce. Return 1 if 
1720: 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65  any of these are
1730: 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f   found.  */.  fo
1740: 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e  r(pLock=pBtree->
1750: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
1760: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
1770: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1780: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
1790: 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28  Btree .     && (
17a0: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69  pLock->iTable==i
17b0: 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65  Tab || (pLock->e
17c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
17d0: 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c   && pLock->iTabl
17e0: 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70  e==1)).     && p
17f0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f  Lock->eLock>=eLo
1800: 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20  ckType .    ){. 
1810: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1820: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
1830: 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68  ailed to find th
1840: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1850: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
1860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1870: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
1880: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1890: 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75  ./*.**** This fu
18a0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73  nction may be us
18b0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18c0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
18d0: 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a  s only. ****.**.
18e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
18f0: 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c  f it would be il
1900: 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65  legal for pBtree
1910: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
1920: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69  he.** table or i
1930: 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69  ndex rooted at i
1940: 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68  Root because oth
1950: 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63  er shared connec
1960: 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d  tions are.** sim
1970: 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64  ultaneously read
1980: 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61  ing that same ta
1990: 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a  ble or index..**
19a0: 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
19b0: 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20  l for pBtree to 
19c0: 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74  write if some ot
19d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
19e0: 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20   that.** shares 
19f0: 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65  the same BtShare
1a00: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72  d object is curr
1a10: 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72  ently reading or
1a20: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
1a30: 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78  iRoot table.  Ex
1a40: 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68  cept, if the oth
1a50: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1a60: 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d  has the.** read-
1a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1a80: 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73   set, then it is
1a90: 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65   OK for the othe
1aa0: 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68  r object to.** h
1ab0: 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f  ave a read curso
1ac0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
1ad0: 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69  mple, before wri
1ae0: 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74  ting to any part
1af0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
1b00: 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64   index.** rooted
1b10: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
1b20: 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a  one should call:
1b30: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
1b40: 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  ( !hasReadConfli
1b50: 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f  cts(pBtree, iRoo
1b60: 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  t) );.*/.static 
1b70: 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c  int hasReadConfl
1b80: 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72  icts(Btree *pBtr
1b90: 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b  ee, Pgno iRoot){
1ba0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1bb0: 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1bc0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1bd0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1be0: 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1bf0: 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26  t==iRoot .     &
1c00: 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74  & p->pBtree!=pBt
1c10: 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  ree.     && 0==(
1c20: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  p->pBtree->db->f
1c30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
1c40: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20  adUncommitted). 
1c50: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1c60: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
1c80: 6e 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65  ndif    /* #ifde
1c90: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  f SQLITE_DEBUG *
1ca0: 2f 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  /../*.** Query t
1cb0: 6f 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68  o see if Btree h
1cc0: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
1cd0: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
1ce0: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
1cf0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1d00: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
1d10: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
1d20: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
1d30: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
1d40: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
1d50: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
1d60: 69 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64  ing.** setShared
1d70: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
1d80: 29 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43  ), or SQLITE_LOC
1d90: 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  KED if not..*/.s
1da0: 74 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53  tatic int queryS
1db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1dc0: 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67  ock(Btree *p, Pg
1dd0: 6e 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63  no iTab, u8 eLoc
1de0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
1df0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1e00: 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a  BtLock *pIter;..
1e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1e30: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
1e40: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
1e50: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  K || eLock==WRIT
1e60: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
1e70: 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a  rt( p->db!=0 );.
1e80: 20 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64    assert( !(p->d
1e90: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1ea0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1eb0: 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ||eLock==WRITE_L
1ec0: 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a  OCK||iTab==1 );.
1ed0: 20 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65    .  /* If reque
1ee0: 73 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  sting a write-lo
1ef0: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72  ck, then the Btr
1f00: 65 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20  ee must have an 
1f10: 6f 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20  open write.  ** 
1f20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f30: 68 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f  his file. And, o
1f40: 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68  bviously, for th
1f50: 69 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72  is to be so ther
1f60: 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  e .  ** must be 
1f70: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1f90: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20   file itself..  
1fa0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  */.  assert( eLo
1fb0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1fc0: 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65   (p==pBt->pWrite
1fd0: 72 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  r && p->inTrans=
1fe0: 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b  =TRANS_WRITE) );
1ff0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
2000: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
2010: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2020: 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
2030: 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72  ;.  .  /* This r
2040: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2050: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
2060: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
2070: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
2080: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
2090: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
20b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e   some other conn
20c0: 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
20d0: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
20e0: 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65  ock, the.  ** re
20f0: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79  quested lock may
2100: 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
2110: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
2120: 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20  ->pWriter!=p && 
2130: 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
2140: 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21   BTS_EXCLUSIVE)!
2150: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2160: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2170: 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70  ed(p->db, pBt->p
2180: 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20  Writer->db);.   
2190: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
21a0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
21b0: 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49  E;.  }..  for(pI
21c0: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
21d0: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
21e0: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
21f0: 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2200: 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d   (pIter->eLock!=
2210: 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f  eLock) in the fo
2220: 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20  llowing if(...) 
2230: 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
2240: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2250: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a  ation of:.    **
2260: 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b  .    **   (eLock
2270: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20  ==WRITE_LOCK || 
2280: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2290: 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a  ITE_LOCK).    **
22a0: 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65  .    ** since we
22b0: 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c   know that if eL
22c0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c  ock==WRITE_LOCK,
22d0: 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63   then no other c
22e0: 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  onnection.    **
22f0: 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54   may hold a WRIT
2300: 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61  E_LOCK on any ta
2310: 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ble in this file
2320: 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61   (since there ca
2330: 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65  n.    ** only be
2340: 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72   a single writer
2350: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
2360: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
2370: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2380: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
2390: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23a0: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
23b0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74  READ_LOCK || pIt
23c0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c  er->pBtree==p ||
23d0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
23e0: 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  EAD_LOCK);.    i
23f0: 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
2400: 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54  !=p && pIter->iT
2410: 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49  able==iTab && pI
2420: 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63  ter->eLock!=eLoc
2430: 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  k ){.      sqlit
2440: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
2450: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
2460: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
2470: 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d       if( eLock==
2480: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  WRITE_LOCK ){.  
2490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
24a0: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  =pBt->pWriter );
24b0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74  .        pBt->bt
24c0: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45  sFlags |= BTS_PE
24d0: 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20  NDING;.      }. 
24e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24f0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
2500: 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CACHE;.    }.  }
2510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2520: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2530: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2540: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2560: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2570: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
2580: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
2590: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
25a0: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
25b0: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
25c0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
25d0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
25e0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
25f0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
2600: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
2610: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2620: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66  on assumes the f
2630: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
2640: 20 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66    (a) The specif
2650: 69 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74  ied Btree object
2660: 20 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20   p is connected 
2670: 74 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a  to a sharable.**
2680: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
2690: 28 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74  (one with the Bt
26a0: 53 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20  Shared.sharable 
26b0: 66 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a  flag set), and.*
26c0: 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74  *.**   (b) No ot
26d0: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
26e0: 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68  s hold a lock th
26f0: 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20  at conflicts.** 
2700: 20 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72        with the r
2710: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69  equested lock (i
2720: 2e 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43  .e. querySharedC
2730: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2740: 68 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72  has.**       alr
2750: 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2760: 20 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51   and returned SQ
2770: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
2780: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2790: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63  urned if the loc
27a0: 6b 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65  k is added succe
27b0: 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f  ssfully. SQLITE_
27c0: 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74  NOMEM .** is ret
27d0: 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f  urned if a mallo
27e0: 63 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e  c attempt fails.
27f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2800: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
2810: 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c  leLock(Btree *p,
2820: 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38   Pgno iTable, u8
2830: 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61   eLock){.  BtSha
2840: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
2850: 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  t;.  BtLock *pLo
2860: 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b  ck = 0;.  BtLock
2870: 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65   *pIter;..  asse
2880: 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
2890: 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
28a0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
28b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65  ==READ_LOCK || e
28c0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
28d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
28e0: 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  >db!=0 );..  /* 
28f0: 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  A connection wit
2900: 68 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  h the read-uncom
2910: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20  mitted flag set 
2920: 77 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74  will never try t
2930: 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20  o.  ** obtain a 
2940: 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20  read-lock using 
2950: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54  this function. T
2960: 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63  he only read-loc
2970: 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  k obtained.  ** 
2980: 62 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  by a connection 
2990: 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  in read-uncommit
29a0: 74 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74  ted mode is on t
29b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
29c0: 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e   .  ** table, an
29d0: 64 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f  d that lock is o
29e0: 62 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65  btained in Btree
29f0: 42 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a  BeginTrans().  *
2a00: 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28  /.  assert( 0==(
2a10: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  p->db->flags&SQL
2a20: 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2a30: 74 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  ted) || eLock==W
2a40: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
2a50: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2a60: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2a70: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
2a80: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
2a90: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
2aa0: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
2ab0: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
2ac0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
2ad0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
2ae0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
2af0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
2b00: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
2b10: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
2b20: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
2b30: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
2b40: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
2b50: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
2b60: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
2b70: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
2b80: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
2b90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
2ba0: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
2bb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
2bc0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2bd0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
2be0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
2bf0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
2c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
2c20: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
2c30: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
2c40: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
2c50: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
2c60: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
2c70: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
2c80: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
2c90: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
2cb0: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
2cc0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
2cd0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
2ce0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
2cf0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
2d00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2d20: 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54   }.    pLock->iT
2d30: 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20  able = iTable;. 
2d40: 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65     pLock->pBtree
2d50: 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d   = p;.    pLock-
2d60: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  >pNext = pBt->pL
2d70: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c  ock;.    pBt->pL
2d80: 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d  ock = pLock;.  }
2d90: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42  ..  /* Set the B
2da0: 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69  tLock.eLock vari
2db0: 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69  able to the maxi
2dc0: 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65  mum of the curre
2dd0: 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64  nt lock.  ** and
2de0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
2df0: 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ock. This means 
2e00: 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  if a write-lock 
2e10: 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64  was already held
2e20: 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64  .  ** and a read
2e30: 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c  -lock requested,
2e40: 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72   we don't incorr
2e50: 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20  ectly downgrade 
2e60: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  the lock..  */. 
2e70: 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c   assert( WRITE_L
2e80: 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b  OCK>READ_LOCK );
2e90: 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f  .  if( eLock>pLo
2ea0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck->eLock ){.   
2eb0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
2ec0: 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  eLock;.  }..  re
2ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2ef0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2f00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2f10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2f20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2f30: 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   Release all the
2f40: 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f   table locks (lo
2f50: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61  cks obtained via
2f60: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65   calls to.** the
2f70: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
2f80: 61 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65  ableLock() proce
2f90: 64 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74  dure) held by Bt
2fa0: 72 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a  ree object p..**
2fb0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fc0: 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42  n assumes that B
2fd0: 74 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70  tree p has an op
2fe0: 65 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  en read or write
2ff0: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
3000: 2e 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  . If it does not
3010: 2c 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50  , then the BTS_P
3020: 45 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d  ENDING flag.** m
3030: 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c  ay be incorrectl
3040: 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74  y cleared..*/.st
3050: 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41  atic void clearA
3060: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3070: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3080: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
3090: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
30a0: 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d  tLock **ppIter =
30b0: 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20   &pBt->pLock;.. 
30c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30d0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
30e0: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
30f0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30  p->sharable || 0
3100: 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61  ==*ppIter );.  a
3110: 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
3120: 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28  s>0 );..  while(
3130: 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20   *ppIter ){.    
3140: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3150: 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73  *ppIter;.    ass
3160: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
3170: 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53  ags & BTS_EXCLUS
3180: 49 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  IVE)==0 || pBt->
3190: 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e  pWriter==pLock->
31a0: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73  pBtree );.    as
31b0: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74  sert( pLock->pBt
31c0: 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c  ree->inTrans>=pL
31d0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock->eLock );.  
31e0: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74    if( pLock->pBt
31f0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
3200: 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d  *ppIter = pLock-
3210: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73  >pNext;.      as
3220: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61  sert( pLock->iTa
3230: 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d  ble!=1 || pLock=
3240: 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20  =&p->lock );.   
3250: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54     if( pLock->iT
3260: 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20  able!=1 ){.     
3270: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3280: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  pLock);.      }.
3290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a0: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
32b0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
32c0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70   }..  assert( (p
32d0: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32e0: 54 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c  TS_PENDING)==0 |
32f0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  | pBt->pWriter )
3300: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  ;.  if( pBt->pWr
3310: 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70  iter==p ){.    p
3320: 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b  Bt->pWriter = 0;
3330: 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
3340: 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c  gs &= ~(BTS_EXCL
3350: 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e  USIVE|BTS_PENDIN
3360: 47 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  G);.  }else if( 
3370: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
3380: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==2 ){.    /* T
3390: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33a0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65  called when Btre
33b0: 65 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e  e p is concludin
33c0: 67 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72  g its .    ** tr
33d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68  ansaction. If th
33e0: 65 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ere currently ex
33f0: 69 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61  ists a writer, a
3400: 6e 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20  nd p is not.    
3410: 2a 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20  ** that writer, 
3420: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
3430: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
3440: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
3450: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
3460: 68 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62  he writer must b
3470: 65 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20  e about to drop 
3480: 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  to zero. In this
3490: 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74   case.    ** set
34a0: 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47   the BTS_PENDING
34b0: 20 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20   flag to 0..    
34c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
34d0: 72 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  re is not curren
34e0: 74 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68  tly a writer, th
34f0: 65 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d  en BTS_PENDING m
3500: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3510: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3520: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3530: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3540: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3550: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
3560: 20 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47   &= ~BTS_PENDING
3570: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3580: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61  his function cha
3590: 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c  nges all write-l
35a0: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72  ocks held by Btr
35b0: 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c  ee p into read-l
35c0: 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ocks..*/.static 
35d0: 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c  void downgradeAl
35e0: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
35f0: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3600: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3610: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66  t = p->pBt;.  if
3620: 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  ( pBt->pWriter==
3630: 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  p ){.    BtLock 
3640: 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d  *pLock;.    pBt-
3650: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3660: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3670: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3680: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3690: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
36a0: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
36b0: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
36c0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
36d0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
36e0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
36f0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3700: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
3710: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
3720: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
3730: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
3740: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
3750: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
3760: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3770: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3780: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3790: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
37a0: 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  *** This routine
37b0: 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20   is used inside 
37c0: 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79  of assert() only
37d0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69   ****.**.** Veri
37e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
37f0: 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74  or holds the mut
3800: 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72  ex on its BtShar
3810: 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ed.*/.#ifdef SQL
3820: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
3830: 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73   int cursorHolds
3840: 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a  Mutex(BtCursor *
3850: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  p){.  return sql
3860: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3870: 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  p->pBt->mutex);.
3880: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64  }.#endif...#ifnd
3890: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
38a0: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e  NCRBLOB./*.** In
38b0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
38c0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
38d0: 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72  cache for cursor
38e0: 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a   pCur, if any..*
38f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3900: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3910: 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a  Cache(BtCursor *
3920: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
3930: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3940: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
3950: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
3960: 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43  aOverflow);.  pC
3970: 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
3980: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  0;.}../*.** Inva
3990: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
39a0: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
39b0: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
39c0: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
39d0: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
39e0: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
39f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3a00: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
3a10: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
3a20: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
3a30: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
3a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
3a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
3a60: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
3a70: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
3a80: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
3a90: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
3aa0: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
3ab0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
3ac0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
3ad0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
3ae0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
3af0: 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20  f a table.** to 
3b00: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69  invalidate any i
3b10: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
3b20: 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e  that are open on
3b30: 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f   the.** row or o
3b40: 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20 62  ne of the rows b
3b50: 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  eing modified..*
3b60: 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
3b70: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3b80: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
3b90: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
3ba0: 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20  of the.** table 
3bb0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64  is about to be d
3bc0: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
3bd0: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20  case invalidate 
3be0: 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20  all incrblob.** 
3bf0: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
3c00: 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74  any row within t
3c10: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
3c20: 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74  ot-page pgnoRoot
3c30: 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
3c40: 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  e, if argument i
3c50: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66  sClearTable is f
3c60: 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72  alse, then the r
3c70: 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64  ow with.** rowid
3c80: 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72   iRow is being r
3c90: 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74  eplaced or delet
3ca0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3cb0: 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f   invalidate.** o
3cc0: 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c  nly those incrbl
3cd0: 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
3ce0: 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69 63  on that specific
3cf0: 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
3d00: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49  void invalidateI
3d10: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a  ncrblobCursors(.
3d20: 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c    Btree *pBtree,
3d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
3d50: 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36 34  o check */.  i64
3d60: 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20   iRow,          
3d70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
3d80: 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  d that might be 
3d90: 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e  changing */.  in
3da0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20  t isClearTable  
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65   all rows are be
3dd0: 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29  ing deleted */.)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3e00: 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
3e10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3e20: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
3e30: 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f  (pBtree) );.  fo
3e40: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3e50: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3e60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49  {.    if( p->isI
3e70: 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
3e80: 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c   (isClearTable |
3e90: 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  | p->info.nKey==
3ea0: 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20 70  iRow) ){.      p
3eb0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
3ec0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d  R_INVALID;.    }
3ed0: 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20  .  }.}..#else.  
3ee0: 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e  /* Stub function
3ef0: 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20  s when INCRBLOB 
3f00: 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20  is omitted */.  
3f10: 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61  #define invalida
3f20: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3f30: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
3f40: 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
3f50: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
3f60: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
3f70: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
3f80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
3f90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
3fa0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
3fb0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
3fc0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
3fd0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
3fe0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
3ff0: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4000: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4010: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4020: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4030: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4040: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4050: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4060: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4070: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
4080: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
4090: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
40a0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
40b0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
40c0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
40d0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
40e0: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
40f0: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4100: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4110: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4120: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4130: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4140: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4150: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4160: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4170: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
4180: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
4190: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
41a0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
41b0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
41c0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
41d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
41e0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
41f0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4200: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4210: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4220: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4230: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4240: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4250: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4260: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4270: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
4280: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4290: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
42a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
42b0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
42c0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
42d0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
42e0: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
42f0: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4300: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4310: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4320: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4330: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4340: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4350: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4360: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4370: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
4380: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
4390: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
43a0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
43b0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
43c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
43d0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
43e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
43f0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4400: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4410: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4420: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4430: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4440: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4450: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4460: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4470: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
4480: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
4490: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
44a0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
44b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
44c0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
44d0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
44e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
44f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4500: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4510: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4520: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4530: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4540: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4550: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4560: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4570: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4580: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
4590: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
45a0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
45b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
45c0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
45d0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
45e0: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
45f0: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4600: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4610: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4620: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4630: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4640: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4650: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4660: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4670: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
4680: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
4690: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
46a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
46b0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
46c0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
46d0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
46e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
46f0: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4700: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4710: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4720: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4730: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4740: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4750: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4760: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4770: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4780: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4790: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
47a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
47b0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
47c0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
47d0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
47e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
47f0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4800: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4810: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4830: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4840: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4850: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4860: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4870: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4880: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4890: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
48a0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
48b0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
48c0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
48d0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
48e0: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
48f0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4900: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4910: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4920: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4940: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4950: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4960: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4970: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4980: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4990: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
49a0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
49b0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
49c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49d0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
49e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
49f0: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4a00: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4a10: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4a20: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4a30: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4a40: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4a50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4a60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4a70: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4a80: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4a90: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4aa0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4ab0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4ae0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4af0: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4b00: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4b10: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4b20: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4b30: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
4b40: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
4b50: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
4b60: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
4b70: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
4b80: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
4b90: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
4ba0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
4bb0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
4bc0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
4bd0: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
4be0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4bf0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4c00: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4c10: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4c20: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
4c30: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
4c40: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
4c50: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
4c60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
4c70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
4c80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4c90: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4ca0: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4cb0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
4cc0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
4cd0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
4ce0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
4cf0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
4d00: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
4d10: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
4d20: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
4d30: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
4d40: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
4d50: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
4d60: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
4d70: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
4d80: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
4d90: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
4da0: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
4db0: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
4dc0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
4dd0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
4de0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
4df0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
4e00: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
4e10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
4e20: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
4e30: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  intKey ){.    vo
4e40: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
4e50: 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70  e3Malloc( (int)p
4e60: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
4e70: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
4e80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4e90: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
4ea0: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
4eb0: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
4ec0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4ed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
4ee0: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
4ef0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4f00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4f10: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
4f20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4f30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4f40: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
4f50: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61  assert( !pCur->a
4f60: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
4f70: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
4f80: 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
4f90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
4fa0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
4fb0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4fc0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
4fd0: 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
4fe0: 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
4ff0: 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
5000: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
5010: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5020: 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  -1;.    pCur->eS
5030: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45  tate = CURSOR_RE
5040: 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a  QUIRESEEK;.  }..
5050: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
5060: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
5070: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5080: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
5090: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
50a0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
50b0: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
50c0: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
50d0: 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72 6f  e table  with ro
50e0: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55  ot-page iRoot. U
50f0: 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20  sually, this is 
5100: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5110: 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78  re cursor.** pEx
5120: 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f 20  cept is used to 
5130: 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c 65  modify the table
5140: 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29 20   (BtreeDelete() 
5150: 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29  or BtreeInsert()
5160: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
5170: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
5180: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5190: 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72  gno iRoot, BtCur
51a0: 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20  sor *pExcept){. 
51b0: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
51c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
51d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
51e0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
51f0: 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c  rt( pExcept==0 |
5200: 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d  | pExcept->pBt==
5210: 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  pBt );.  for(p=p
5220: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
5230: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
5240: 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74 20   if( p!=pExcept 
5250: 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20  && (0==iRoot || 
5260: 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f  p->pgnoRoot==iRo
5270: 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  ot) && .        
5280: 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  p->eState==CURSO
5290: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
52a0: 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75   int rc = saveCu
52b0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
52c0: 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
52d0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
52e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
52f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5300: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5310: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
5320: 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  ear the current 
5330: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
5340: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5350: 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
5360: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5370: 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
5380: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5390: 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  r) );.  sqlite3_
53a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
53b0: 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d  ;.  pCur->pKey =
53c0: 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61   0;.  pCur->eSta
53d0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
53e0: 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  LID;.}../*.** In
53f0: 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
5400: 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
5410: 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
5420: 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
5430: 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
5440: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
5450: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
5460: 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
5470: 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
5480: 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
5490: 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
54a0: 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74   the work..*/.st
54b0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d 6f  atic int btreeMo
54c0: 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
54d0: 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
54e0: 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
54f0: 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
5500: 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
5510: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
5520: 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
5530: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
5540: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
5550: 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
5560: 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
5570: 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
5580: 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
5590: 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
55a0: 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
55b0: 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
55c0: 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
55d0: 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
55e0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
55f0: 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
5600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
5610: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
5620: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
5630: 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
5640: 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
5650: 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
5660: 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
5670: 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30 5d  char aSpace[150]
5680: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  ;          /* Te
5690: 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
56a0: 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
56b0: 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  a malloc */.  ch
56c0: 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a  ar *pFree = 0;..
56d0: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
56e0: 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d    assert( nKey==
56f0: 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29  (i64)(int)nKey )
5700: 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  ;.    pIdxKey = 
5710: 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
5720: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
5730: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
5740: 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20  eyInfo, aSpace, 
5750: 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c 20  sizeof(aSpace), 
5760: 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20 20  &pFree.    );.  
5770: 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30    if( pIdxKey==0
5780: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
5790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69  _NOMEM;.    sqli
57a0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
57b0: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
57c0: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
57d0: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
57e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
57f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
5800: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
5810: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
5820: 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
5830: 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
5840: 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
5850: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5860: 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  e(pCur->pKeyInfo
5870: 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20 20  ->db, pFree);.  
5880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
58a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
58b0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
58c0: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
58d0: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
58e0: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
58f0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5900: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5910: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5920: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5930: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
5940: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
5950: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5960: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
5970: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
5980: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
5990: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
59a0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
59b0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
59c0: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
59d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
59e0: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
59f0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a00: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a10: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a20: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a30: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5a40: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5a50: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5a60: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5a70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5a80: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5a90: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5aa0: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5ab0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5ac0: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5ad0: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5ae0: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5af0: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b00: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b10: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b30: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5b40: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5b50: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5b60: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5b90: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5ba0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5bb0: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5bc0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5bd0: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5be0: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5bf0: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c00: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c10: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c20: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5c40: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5c50: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5c60: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5c70: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5c80: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5c90: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5ca0: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5cb0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5cc0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5cd0: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5ce0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d00: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d10: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d30: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5d40: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5d50: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5d60: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5d70: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5d80: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5da0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5db0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5dc0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5dd0: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5de0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5df0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e00: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e10: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e20: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e30: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5e40: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5e50: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5e80: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5e90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5ea0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5eb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5ec0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5ed0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5ee0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5ef0: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f10: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f20: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f30: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5f40: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5f50: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5f60: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5f70: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5f80: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5f90: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
5fa0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
5fb0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
5fc0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
5fd0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
5fe0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
5ff0: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6000: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6010: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6020: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6040: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
6050: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
6060: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
6070: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
6080: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6090: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
60a0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
60b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
60c0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
60d0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
60e0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
60f0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6100: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6110: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6120: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6130: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
6140: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
6150: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
6160: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
6170: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
6180: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
6190: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
61a0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
61c0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
61d0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
61e0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
61f0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6200: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6210: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6220: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6230: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
6240: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
6250: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
6260: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
6270: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
6280: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
6290: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
62a0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
62b0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
62c0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
62d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
62e0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
62f0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6300: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6310: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6320: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6330: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
6340: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6350: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
6360: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
6370: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
6380: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
6390: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
63a0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
63b0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
63c0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
63d0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
63e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
63f0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6400: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6410: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6420: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6430: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
6440: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
6450: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
6460: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
6470: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
6480: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
6490: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
64a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
64b0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
64c0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
64d0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
64e0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
64f0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6500: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6510: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6520: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6530: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6540: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6550: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6560: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6570: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6580: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6590: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
65a0: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
65b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
65c0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
65d0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
65e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
65f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6600: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6610: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6620: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6630: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6640: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
6650: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
6660: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6670: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6680: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
6690: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
66a0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
66b0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
66c0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
66d0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
66e0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
66f0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6700: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6710: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6720: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6730: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
6740: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
6750: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6760: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6770: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6790: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
67a0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
67b0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
67c0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
67d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
67e0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
67f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6800: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6810: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6820: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6830: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
6840: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
6850: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
6860: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
6870: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
6880: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
6890: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
68a0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
68b0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
68c0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
68d0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
68e0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
68f0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6900: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6920: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6930: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
6940: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
6950: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
6960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
6970: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
6980: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6990: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
69a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
69b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
69c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
69d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
69e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
69f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a10: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a20: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a30: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6a40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6a50: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6a60: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6a70: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6a80: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6a90: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6aa0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6ab0: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6ac0: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6ad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6ae0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6af0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b00: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b10: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b20: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b30: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6b40: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6b50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6b60: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6b70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6b90: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6ba0: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6bb0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6bc0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6bd0: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6be0: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6bf0: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c00: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c10: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c20: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c30: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6c40: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6c50: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6c60: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6c70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6c80: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6ca0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6cb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6cc0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6cd0: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6ce0: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6cf0: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d00: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d10: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d20: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d30: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6d40: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6d50: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6d60: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6d70: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6d80: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6d90: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6da0: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6db0: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6dc0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6dd0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6de0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6df0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e00: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e10: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e20: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e30: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6e40: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6e50: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6e60: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6e70: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
6e80: 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65  *(I)]))).#define
6e90: 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c   findCellv2(D,M,
6ea0: 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62  O,I) (D+(M&get2b
6eb0: 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29  yte(D+(O+2*(I)))
6ec0: 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )).../*.** This 
6ed0: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
6ee0: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
6ef0: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
6f00: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
6f10: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
6f20: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  rflow cells..*/.
6f30: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
6f40: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
6f50: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
6f60: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
6f70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f80: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
6f90: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
6fa0: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
6fb0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
6fc0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
6fd0: 69 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70  int k;.    k = p
6fe0: 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b  Page->aiOvfl[i];
6ff0: 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c  .    if( k<=iCel
7000: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  l ){.      if( k
7010: 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==iCell ){.     
7020: 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d     return pPage-
7030: 3e 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  >apOvfl[i];.    
7040: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
7050: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
7060: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
7070: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
7080: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
7090: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
70a0: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
70b0: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
70c0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
70d0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
70e0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
70f0: 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65  n.  btreeParseCe
7100: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
7110: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
7120: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
7130: 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73  nt and btreePars
7140: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
7150: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
7160: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
7170: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
7180: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
7190: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
71a0: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
71b0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
71c0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
71d0: 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61  ad of.** btreePa
71e0: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
71f0: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
7200: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
7210: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   faster..*/.stat
7220: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
7230: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
7240: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
7250: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
7260: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
7270: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7290: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
72a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
72b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
72c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
72d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
72e0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
7310: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
7320: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
7330: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
7340: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7350: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
7360: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
7370: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7380: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7390: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
73a0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
73b0: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
73c0: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
73d0: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
73e0: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
73f0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7400: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
7410: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
7420: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
7430: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
7440: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
7450: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
7460: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
7470: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
7480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7490: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
74a0: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
74b0: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
74c0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
74d0: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
74e0: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
74f0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
7500: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
7510: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
7520: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
7530: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
7540: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
7550: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
7560: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
7570: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
7580: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
7590: 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  n;.  testcase( n
75a0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
75b0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
75c0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
75d0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
75e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b  l+1 );.  if( lik
75f0: 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  ely(nPayload<=pP
7600: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29  age->maxLocal) )
7610: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
7620: 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d   the (easy) comm
7630: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
7640: 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64  e entire payload
7650: 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20   fits.    ** on 
7660: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20  the local page. 
7670: 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20   No overflow is 
7680: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
7690: 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d  .    if( (pInfo-
76a0: 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e  >nSize = (u16)(n
76b0: 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20  +nPayload))<4 ) 
76c0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
76d0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
76e0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
76f0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
7700: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
7710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
7720: 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69  f the payload wi
7730: 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c  ll not fit compl
7740: 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63  etely on the loc
7750: 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65  al page, we have
7760: 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  .    ** to decid
7770: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
7780: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
7790: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
77a0: 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76  l onto.    ** ov
77b0: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
77c0: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
77d0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
77e0: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
77f0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20      ** space on 
7800: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
7810: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
7820: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
7830: 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20   storage.    ** 
7840: 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f  in between minLo
7850: 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c  cal and maxLocal
7860: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7870: 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69  Warning:  changi
7880: 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66  ng the way overf
7890: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64  low payload is d
78a0: 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e  istributed in an
78b0: 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c  y.    ** way wil
78c0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
78d0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
78e0: 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a   format..    */.
78f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7900: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
7910: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7920: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7930: 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c      int maxLocal
7940: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
7950: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
7960: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
7970: 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b      int surplus;
7980: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
7990: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
79a0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
79b0: 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f  ge */..    minLo
79c0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e  cal = pPage->min
79d0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f  Local;.    maxLo
79e0: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
79f0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c  Local;.    surpl
7a00: 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  us = minLocal + 
7a10: 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c  (nPayload - minL
7a20: 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42  ocal)%(pPage->pB
7a30: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7a40: 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
7a50: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
7a60: 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  cal );.    testc
7a70: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
7a80: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
7a90: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7aa0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7ab0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7ac0: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
7ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ae0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7af0: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
7b00: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
7b10: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
7b20: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
7b30: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
7b40: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
7b50: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
7b60: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
7b70: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7b80: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7b90: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7ba0: 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43  r((pPage), findC
7bb0: 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43  ell((pPage), (iC
7bc0: 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a  ell)), (pInfo)).
7bd0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
7be0: 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65  eParseCell(.  Me
7bf0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
7c00: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
7c10: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
7c20: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  l */.  int iCell
7c30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7c40: 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  * The cell index
7c50: 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73  .  First cell is
7c60: 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f   0 */.  CellInfo
7c70: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
7c80: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
7c90: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
7ca0: 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67    parseCell(pPag
7cb0: 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, iCell, pInfo)
7cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
7cd0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
7ce0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
7cf0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
7d00: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
7d10: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
7d20: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
7d30: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
7d40: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
7d50: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
7d60: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
7d70: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
7d80: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
7d90: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
7da0: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
7db0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61   pointer..*/.sta
7dc0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7dd0: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
7de0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
7df0: 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70    u8 *pIter = &p
7e00: 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c  Cell[pPage->chil
7e10: 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32  dPtrSize];.  u32
7e20: 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20   nSize;..#ifdef 
7e30: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
7e40: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
7e50: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
7e60: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
7e70: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
7e80: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
7e90: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
7ea0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
7eb0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
7ec0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
7ed0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
7ee0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
7ef0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
7f00: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
7f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
7f20: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
7f30: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
7f40: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
7f50: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
7f60: 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  fo;.  btreeParse
7f70: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
7f80: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
7f90: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
7fa0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
7fb0: 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a  {.    u8 *pEnd;.
7fc0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
7fd0: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
7fe0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
7ff0: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a  nt32(pIter, nSiz
8000: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
8010: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a       nSize = 0;.
8020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49      }..    /* pI
8030: 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61  ter now points a
8040: 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74  t the 64-bit int
8050: 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20  eger key value, 
8060: 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
8070: 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  h .    ** intege
8080: 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  r. The following
8090: 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74   block moves pIt
80a0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
80b0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20  he first byte.  
80c0: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
80d0: 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c  d of the key val
80e0: 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20  ue. */.    pEnd 
80f0: 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20  = &pIter[9];.   
8100: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
8110: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
8120: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65  <pEnd );.  }else
8130: 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  {.    pIter += g
8140: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
8150: 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  , nSize);.  }.. 
8160: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8170: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8180: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8190: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
81a0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
81b0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
81c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
81d0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
81e0: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
81f0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
8200: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
8210: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
8220: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
8230: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
8240: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8250: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
8260: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8280: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
8290: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
82a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
82b0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
82c0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
82d0: 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  Size += 4;.  }. 
82e0: 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28   nSize += (u32)(
82f0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
8300: 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75  .  /* The minimu
8310: 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65  m size of any ce
8320: 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a  ll is 4 bytes. *
8330: 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20  /.  if( nSize<4 
8340: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  ){.    nSize = 4
8350: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
8360: 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66   nSize==debuginf
8370: 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74  o.nSize );.  ret
8380: 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a  urn (u16)nSize;.
8390: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
83a0: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76  _DEBUG./* This v
83b0: 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c  ariation on cell
83c0: 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65  SizePtr() is use
83d0: 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  d inside of asse
83e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a  rt() statements.
83f0: 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74  ** only. */.stat
8400: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28  ic u16 cellSize(
8410: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8420: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65  int iCell){.  re
8430: 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  turn cellSizePtr
8440: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
8450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b  (pPage, iCell));
8460: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
8470: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
8480: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
8490: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
84a0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
84b0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
84c0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
84d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
84e0: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
84f0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
8500: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
8510: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
8520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8530: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
8540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8550: 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a  u8 *pCell, int *
8560: 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f  pRC){.  CellInfo
8570: 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52   info;.  if( *pR
8580: 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  C ) return;.  as
8590: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
85a0: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
85b0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
85c0: 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
85d0: 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74  sert( (info.nDat
85e0: 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  a+(pPage->intKey
85f0: 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d  ?0:info.nKey))==
8600: 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
8610: 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65  .  if( info.iOve
8620: 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e  rflow ){.    Pgn
8630: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
8640: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
8650: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70  verflow]);.    p
8660: 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e  trmapPut(pPage->
8670: 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41  pBt, ovfl, PTRMA
8680: 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
8690: 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a  ge->pgno, pRC);.
86a0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f    }.}.#endif.../
86b0: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
86c0: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
86d0: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
86e0: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
86f0: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
8700: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
8710: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
8720: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
8730: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
8740: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
8750: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
8760: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
8770: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
8780: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
8790: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
87a0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
87b0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
87c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
87d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
87e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
87f0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
8800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
8810: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
8820: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ll */.  int hdr;
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8840: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
8850: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20  the page header 
8860: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
8870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8880: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
8890: 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  l */.  int usabl
88a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
88b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
88c0: 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61  sable bytes on a
88d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63   page */.  int c
88e0: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20  ellOffset;      
88f0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
8900: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
8910: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
8920: 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
8930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
8940: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
8950: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
8960: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8980: 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
8990: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
89a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
89b0: 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54  data;       /* T
89c0: 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  he page data */.
89d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
89e0: 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20  *temp;       /* 
89f0: 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65  Temp area for ce
8a00: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
8a10: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8a30: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
8a40: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ll index */.  in
8a50: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
8a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
8a70: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69   possible cell i
8a80: 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65  ndex */...  asse
8a90: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8aa0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8ab0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8ac0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8ad0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
8ae0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
8af0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
8b00: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8b10: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
8b20: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8b30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8b40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8b50: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8b60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
8b70: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
8b80: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
8b90: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
8ba0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
8bb0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
8bc0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
8bd0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
8be0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
8bf0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
8c00: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
8c10: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
8c20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
8c30: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
8c40: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
8c50: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
8c60: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
8c70: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
8c80: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
8c90: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
8ca0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
8cb0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
8cc0: 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46  leSize;.  iCellF
8cd0: 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  irst = cellOffse
8ce0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69  t + 2*nCell;.  i
8cf0: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
8d00: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
8d10: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
8d20: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
8d30: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
8d40: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
8d50: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
8d60: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
8d70: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
8d80: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
8d90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8da0: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
8db0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8dc0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
8dd0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
8de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
8df0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
8e00: 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ).    /* These c
8e10: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
8e20: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
8e30: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
8e40: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
8e50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8e60: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
8e70: 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a  ECK is defined .
8e80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8e90: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
8ea0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
8eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8ec0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8ed0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
8ee0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
8ef0: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
8f00: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
8f10: 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a    size = cellSiz
8f20: 65 50 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d  ePtr(pPage, &tem
8f30: 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b  p[pc]);.    cbrk
8f40: 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65   -= size;.#if de
8f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
8f60: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
8f70: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28  L_CHECK).    if(
8f80: 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74   cbrk<iCellFirst
8f90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8fa0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8fb0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  BKPT;.    }.#els
8fc0: 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  e.    if( cbrk<i
8fd0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
8fe0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
8ff0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9000: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9010: 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  KPT;.    }.#endi
9020: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62  f.    assert( cb
9030: 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53  rk+size<=usableS
9040: 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65  ize && cbrk>=iCe
9050: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
9060: 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69  estcase( cbrk+si
9070: 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  ze==usableSize )
9080: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
9090: 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  pc+size==usableS
90a0: 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ize );.    memcp
90b0: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
90c0: 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b  temp[pc], size);
90d0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41  .    put2byte(pA
90e0: 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a  ddr, cbrk);.  }.
90f0: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d    assert( cbrk>=
9100: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
9110: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9120: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
9130: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
9140: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
9150: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
9160: 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  ] = 0;.  memset(
9170: 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74  &data[iCellFirst
9180: 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c  ], 0, cbrk-iCell
9190: 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74  First);.  assert
91a0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
91b0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
91c0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
91d0: 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  f( cbrk-iCellFir
91e0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
91f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9200: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9210: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
9220: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
9230: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
9240: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
9250: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
9260: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
9270: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
9280: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
9290: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
92a0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
92b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
92c0: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
92d0: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
92e0: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
92f0: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
9300: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
9310: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
9320: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
9330: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
9340: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
9350: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
9360: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
9370: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
9380: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
9390: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
93a0: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
93b0: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
93c0: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
93d0: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
93e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
93f0: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
9400: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
9410: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
9420: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
9430: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
9440: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
9450: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
9460: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
9470: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
9480: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
9490: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
94a0: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
94b0: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
94c0: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
94d0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
94e0: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
94f0: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
9500: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
9510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
9520: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
9530: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
9540: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
9550: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
9560: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
9570: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
9580: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
9590: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
95c0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
95d0: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
95e0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20  */.  int top;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9610: 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20  st byte of cell 
9620: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
9630: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
9640: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
9650: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
9660: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
9670: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
9680: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9690: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
96a0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
96b0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f  nt usableSize; /
96c0: 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66  * Usable size of
96d0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a   the page */.  .
96e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96f0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9700: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9710: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9720: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
9730: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9740: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9750: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9760: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e    assert( nByte>
9770: 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =0 );  /* Minimu
9780: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9790: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
97a0: 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74  age->nFree>=nByt
97b0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
97c0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
97d0: 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  =0 );.  usableSi
97e0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
97f0: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61  >usableSize;.  a
9800: 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75  ssert( nByte < u
9810: 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a  sableSize-8 );..
9820: 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68    nFrag = data[h
9830: 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28  dr+7];.  assert(
9840: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
9850: 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d  et == hdr + 12 -
9860: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29   4*pPage->leaf )
9870: 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d  ;.  gap = pPage-
9880: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
9890: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
98a0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
98b0: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
98c0: 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74  5]);.  if( gap>t
98d0: 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  op ) return SQLI
98e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
98f0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9900: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
9910: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
9920: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
9930: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20   gap==top );..  
9940: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b  if( nFrag>=60 ){
9950: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64  .    /* Always d
9960: 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79  efragment highly
9970: 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65   fragmented page
9980: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65  s */.    rc = de
9990: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
99a0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
99b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
99c0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
99d0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
99e0: 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  +5]);.  }else if
99f0: 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a  ( gap+2<=top ){.
9a00: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68      /* Search th
9a10: 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69  e freelist looki
9a20: 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c  ng for a free sl
9a30: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
9a40: 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a   satisfy .    **
9a50: 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54 68   the request. Th
9a60: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
9a70: 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69  made from the fi
9a80: 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e  rst free slot in
9a90: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73   .    ** the lis
9aa0: 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 20  t that is large 
9ab0: 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61  enough to accoma
9ac0: 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  date it..    */.
9ad0: 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72      int pc, addr
9ae0: 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68  ;.    for(addr=h
9af0: 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32  dr+1; (pc = get2
9b00: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
9b10: 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a  ))>0; addr=pc){.
9b20: 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20        int size; 
9b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b40: 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73  ze of the free s
9b50: 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  lot */.      if(
9b60: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
9b70: 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b   || pc<addr+4 ){
9b80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9b90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9ba0: 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
9bb0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
9bc0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
9bd0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
9be0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
9bf0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
9c00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
9c10: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
9c20: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
9c30: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
9c40: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
9c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
9c60: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
9c70: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
9c80: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
9c90: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
9ca0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
9cb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
9cc0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
9cd0: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
9ce0: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
9cf0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
9d00: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
9d10: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
9d20: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
9d30: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
9d40: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
9d50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9d60: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9d70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9d80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
9d90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
9da0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
9db0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
9dc0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
9dd0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
9de0: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
9df0: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
9e00: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
9e10: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
9e20: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
9e30: 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d  .        *pIdx =
9e40: 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20   pc + x;.       
9e50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9e60: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
9e70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
9e80: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
9e90: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70  ere is enough sp
9ea0: 61 63 65 20 69 6e 20 74 68 65 20 67 61 70 20 74  ace in the gap t
9eb0: 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74  o satisfy.  ** t
9ec0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  he allocation.  
9ed0: 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65  If not, defragme
9ee0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  nt..  */.  testc
9ef0: 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65  ase( gap+2+nByte
9f00: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67  ==top );.  if( g
9f10: 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29  ap+2+nByte>top )
9f20: 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  {.    rc = defra
9f30: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
9f40: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9f50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
9f60: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9f70: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9f80: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
9f90: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
9fa0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
9fb0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
9fc0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
9fd0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
9fe0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
9ff0: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
a000: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
a010: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
a020: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
a030: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
a040: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
a050: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
a060: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
a070: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
a080: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
a090: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
a0a0: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
a0b0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
a0c0: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
a0d0: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
a0e0: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
a0f0: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
a100: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
a110: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
a120: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
a130: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
a140: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
a150: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
a160: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
a170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
a190: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
a1a0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
a1b0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
a1c0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
a1d0: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
a1e0: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
a1f0: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
a200: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
a210: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
a220: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
a230: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
a240: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
a250: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
a260: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
a270: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
a280: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
a290: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
a2a0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
a2b0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
a2c0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
a2d0: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
a2e0: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
a2f0: 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20  r;.  int iLast; 
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
a320: 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62  t possible freeb
a330: 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20  lock offset */. 
a340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a350: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
a360: 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
a370: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
a380: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
a390: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
a3a0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
a3b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
a3c0: 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  start>=pPage->hd
a3d0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
a3e0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
a3f0: 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72  .  assert( (star
a400: 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e  t + size) <= (in
a410: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
a420: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
a430: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a440: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a450: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a460: 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30   assert( size>=0
a470: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
a480: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
a490: 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  */..  if( pPage-
a4a0: 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
a4b0: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
a4c0: 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  TE ){.    /* Ove
a4d0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
a4e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
a4f0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
a500: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
a510: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
a520: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
a530: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
a540: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a  , 0, size);.  }.
a550: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
a560: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
a570: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
a580: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
a590: 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65  te that.  ** eve
a5a0: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
a5b0: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
a5c0: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
a5d0: 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a  InitPage(),.  **
a5e0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
a5f0: 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20   did not detect 
a600: 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c  overlapping cell
a610: 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c  s or.  ** freebl
a620: 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61  ocks that overla
a630: 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f  pped cells.   No
a640: 72 20 64 6f 65 73 20 69 74 20 64 65 74 65 63 74  r does it detect
a650: 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63   when the.  ** c
a660: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
a670: 20 65 78 63 65 65 64 73 20 74 68 65 20 76 61 6c   exceeds the val
a680: 75 65 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  ue in the page h
a690: 65 61 64 65 72 2e 20 20 49 66 20 74 68 65 73 65  eader.  If these
a6a0: 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73  .  ** situations
a6b0: 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62   arise, then sub
a6c0: 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f  sequent insert o
a6d0: 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20  perations might 
a6e0: 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65  corrupt.  ** the
a6f0: 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77   freelist.  So w
a700: 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65  e do need to che
a710: 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f  ck for corruptio
a720: 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67  n while scanning
a730: 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  .  ** the freeli
a740: 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  st..  */.  hdr =
a750: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
a760: 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20  t;.  addr = hdr 
a770: 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70  + 1;.  iLast = p
a780: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
a790: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73  eSize - 4;.  ass
a7a0: 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73  ert( start<=iLas
a7b0: 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  t );.  while( (p
a7c0: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
a7d0: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73  (&data[addr]))<s
a7e0: 74 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30  tart && pbegin>0
a7f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67   ){.    if( pbeg
a800: 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20  in<addr+4 ){.   
a810: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a820: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a830: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20     }.    addr = 
a840: 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66  pbegin;.  }.  if
a850: 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29  ( pbegin>iLast )
a860: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a870: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a880: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a890: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
a8a0: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
a8b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
a8c0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
a8d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a8e0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
a8f0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a900: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
a910: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
a920: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20   pPage->nFree + 
a930: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
a940: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
a950: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
a960: 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  /.  addr = hdr +
a970: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
a980: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
a990: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20  &data[addr]))>0 
a9a0: 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74  ){.    int pnext
a9b0: 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20  , psize, x;.    
a9c0: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a9d0: 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ddr );.    asser
a9e0: 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e  t( pbegin <= (in
a9f0: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
aa00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
aa10: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
aa20: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
aa30: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
aa40: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
aa50: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
aa60: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
aa70: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
aa80: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
aa90: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
aaa0: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
aab0: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  ze);.      if( (
aac0: 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67  frag<0) || (frag
aad0: 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37  >(int)data[hdr+7
aae0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ]) ){.        re
aaf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ab00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
ab10: 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68 64 72  }.      data[hdr
ab20: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
ab30: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
ab50: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
ab60: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
ab70: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
ab80: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
ab90: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
aba0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
abb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
abc0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
abd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
abe0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
abf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
ac00: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ac10: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
ac20: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
ac30: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
ac40: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
ac50: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
ac60: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
ac70: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
ac80: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
ac90: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
aca0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
acb0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
acc0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
acd0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
ace0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
acf0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
ad00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
ad10: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
ad20: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ad30: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
ad40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ad50: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
ad60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
ad70: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ad80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ad90: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
ada0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
adb0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
adc0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
add0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
ade0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
adf0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
ae00: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
ae10: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
ae20: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ae30: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ae40: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ae50: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
ae60: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ae70: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
ae80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
ae90: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
aea0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
aeb0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
aec0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
aed0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
aee0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
aef0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
af00: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
af10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
af20: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
af30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
af40: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
af50: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
af60: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
af70: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
af80: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
af90: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
afa0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
afb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
afc0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
afd0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
afe0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
aff0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
b000: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
b010: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
b020: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
b030: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
b040: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
b050: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
b060: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
b070: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
b080: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
b090: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
b0a0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
b0b0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
b0c0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
b0d0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
b0e0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
b0f0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
b100: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
b110: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b120: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
b130: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
b140: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
b150: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
b160: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
b170: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
b180: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
b190: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
b1a0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
b1b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1c0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
b1d0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
b1e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b1f0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
b200: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
b210: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
b220: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
b230: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b240: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
b250: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
b260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
b270: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
b280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
b290: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
b2a0: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
b2b0: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
b2c0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
b2d0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
b2e0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
b2f0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
b300: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
b310: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
b320: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
b330: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
b340: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
b350: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
b360: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
b370: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
b380: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
b390: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
b3a0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
b3b0: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
b3c0: 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65  *pPage){..  asse
b3d0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
b3e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b3f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b410: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
b420: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
b430: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
b440: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
b450: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b460: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
b470: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
b480: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
b490: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b4a0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
b4b0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
b4c0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b4d0: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
b4e0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
b4f0: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
b500: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b510: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
b520: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
b530: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
b540: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
b550: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
b560: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
b570: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
b580: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
b590: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
b5a0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
b5b0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
b5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
b5d0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
b5e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
b5f0: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
b600: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
b610: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
b620: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
b630: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
b640: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
b650: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
b660: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
b670: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
b680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b690: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
b6a0: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
b6b0: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b6d0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
b6e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
b6f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
b700: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
b710: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
b720: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
b730: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
b740: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
b750: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b760: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
b770: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
b780: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
b790: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
b7a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
b7b0: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
b7c0: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
b7d0: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
b7e0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
b7f0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
b800: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b810: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
b820: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
b830: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
b840: 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67  5536 );.    pPag
b850: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
b860: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
b870: 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67  e - 1);.    pPag
b880: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
b890: 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
b8a0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
b8b0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63  ze;.    pPage->c
b8c0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c  ellOffset = cell
b8d0: 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31  Offset = hdr + 1
b8e0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b8f0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  f;.    pPage->aD
b900: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
b910: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
b920: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
b930: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
b940: 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  et];.    top = g
b950: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
b960: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b970: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b980: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b990: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
b9a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
b9b0: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
b9c0: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
b9d0: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
b9e0: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
b9f0: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
ba00: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
ba10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba20: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
ba30: 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
ba40: 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c  ->nCell==MX_CELL
ba50: 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  (pBt) );..    /*
ba60: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
ba70: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
ba80: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
ba90: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
baa0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
bab0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
bac0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
bad0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
bae0: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
baf0: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
bb00: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
bb10: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
bb20: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
bb30: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
bb40: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
bb50: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
bb60: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
bb70: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
bb80: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
bb90: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
bba0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
bbb0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
bbc0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23 69  ableSize - 4;.#i
bbd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
bbe0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
bbf0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
bc00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20   {.      int i; 
bc10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
bc20: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
bc30: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
bc40: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
bc50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bc60: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
bc70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bc80: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bc90: 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72  ast--;.      for
bca0: 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
bcb0: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
bcc0: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bcd0: 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  e(&data[cellOffs
bce0: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
bcf0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
bd00: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
bd10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
bd20: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
bd30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
bd40: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
bd50: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
bd60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bd80: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
bd90: 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
bda0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
bdb0: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
bdc0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
bdd0: 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
bde0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
bdf0: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
be00: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
be10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
be20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
be30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be40: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
be50: 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20  ) iCellLast++;. 
be60: 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20     }  .#endif.. 
be70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
be80: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
be90: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ce on the page *
bea0: 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62  /.    pc = get2b
beb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
bec0: 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64  );.    nFree = d
bed0: 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70  ata[hdr+7] + top
bee0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e  ;.    while( pc>
bef0: 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e  0 ){.      u16 n
bf00: 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20  ext, size;.     
bf10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
bf20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
bf30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
bf40: 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20 62   Start of free b
bf50: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
bf60: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
bf70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bf80: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
bf90: 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
bfa0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
bfb0: 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
bfc0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
bfd0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
bfe0: 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20   if( (next>0 && 
bff0: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29  next<=pc+size+3)
c000: 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62   || pc+size>usab
c010: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
c020: 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73    /* Free blocks
c030: 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65   must be in asce
c040: 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64  nding order. And
c050: 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
c060: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
c070: 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74   free-block must
c080: 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61   lie on the data
c090: 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  base page.  */. 
c0a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c0b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c0c0: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
c0d0: 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20    nFree = nFree 
c0e0: 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  + size;.      pc
c0f0: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a   = next;.    }..
c100: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c110: 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74  oint, nFree cont
c120: 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20  ains the sum of 
c130: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
c140: 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f  e start.    ** o
c150: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
c160: 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65  nt area plus the
c170: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
c180: 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20  bytes within.   
c190: 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   ** the cell-con
c1a0: 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68  tent area. If th
c1b0: 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68  is is greater th
c1c0: 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69  an the usable-si
c1d0: 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ze.    ** of the
c1e0: 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
c1f0: 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72  page must be cor
c200: 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65  rupted. This che
c210: 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73  ck also.    ** s
c220: 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20  erves to verify 
c230: 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20  that the offset 
c240: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
c250: 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74  the cell-content
c260: 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63  .    ** area, ac
c270: 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70  cording to the p
c280: 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73  age header, lies
c290: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
c2a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c2b0: 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
c2c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
c2d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c2e0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20  _BKPT; .    }.  
c2f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
c300: 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
c310: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20  CellFirst);.    
c320: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
c330: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
c340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
c350: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
c360: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
c370: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
c380: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
c390: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
c3a0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c3b0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
c3c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
c3d0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
c3e0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
c3f0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
c400: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c410: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
c420: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
c430: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
c440: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
c450: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c460: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
c470: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
c480: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
c490: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
c4a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
c4b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
c4c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
c4d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
c4e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
c4f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
c500: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
c510: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c520: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c530: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c550: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
c560: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  );.  if( pBt->bt
c570: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
c580: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
c590: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
c5a0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
c5b0: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a  bleSize - hdr);.
c5c0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20    }.  data[hdr] 
c5d0: 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20  = (char)flags;. 
c5e0: 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38   first = hdr + 8
c5f0: 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46   + 4*((flags&PTF
c600: 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b  _LEAF)==0 ?1:0);
c610: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
c620: 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
c630: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c640: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c650: 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
c660: 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
c670: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
c680: 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
c690: 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
c6a0: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
c6b0: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
c6c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
c6d0: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
c6e0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
c6f0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
c700: 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d  End = &data[pBt-
c710: 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20  >usableSize];.  
c720: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
c730: 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a  = &data[first];.
c740: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
c750: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
c760: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
c770: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
c780: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
c790: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
c7a0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
c7b0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
c7c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
c7d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
c7e0: 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
c7f0: 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
c800: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
c810: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
c820: 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
c830: 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
c840: 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
c850: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
c860: 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
c870: 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
c880: 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
c890: 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
c8a0: 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
c8b0: 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
c8c0: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
c8d0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
c8e0: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
c8f0: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
c900: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
c910: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
c920: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
c930: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
c940: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
c950: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
c960: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
c970: 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
c980: 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
c990: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
c9a0: 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
c9b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
c9c0: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
c9d0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
c9e0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
c9f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
ca00: 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73  oContent flag is
ca10: 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
ca20: 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
ca30: 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
ca40: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
ca50: 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
ca60: 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
ca70: 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
ca80: 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
ca90: 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
caa0: 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
cab0: 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
cac0: 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
cad0: 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
cae0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
caf0: 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
cb00: 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
cb10: 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
cb20: 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
cb30: 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
cb40: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
cb50: 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
cb60: 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
cb70: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
cb80: 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
cb90: 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
cba0: 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
cbb0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
cbc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
cbd0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
cbe0: 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
cbf0: 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
cc00: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
cc10: 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
cc20: 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  meter */.  int n
cc30: 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 20  oContent        
cc40: 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70  /* Do not load p
cc50: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20 74  age content if t
cc60: 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  rue */.){.  int 
cc70: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
cc80: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
cc90: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
cca0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
ccb0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
ccc0: 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
ccd0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
cce0: 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
ccf0: 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
cd00: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
cd10: 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67  urn rc;.  *ppPag
cd20: 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f  e = btreePageFro
cd30: 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c  mDbPage(pDbPage,
cd40: 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72   pgno, pBt);.  r
cd50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cd60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65  .}../*.** Retrie
cd70: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
cd80: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
cd90: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
cda0: 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   page is not.** 
cdb0: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70  already in the p
cdc0: 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72  ager cache retur
cdd0: 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69  n NULL. Initiali
cde0: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
cdf0: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ce00: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ce10: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73   if needed..*/.s
ce20: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
ce30: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42  treePageLookup(B
ce40: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
ce50: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61  no pgno){.  DbPa
ce60: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
ce70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ce80: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
ce90: 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61  utex) );.  pDbPa
cea0: 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ge = sqlite3Page
ceb0: 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61  rLookup(pBt->pPa
cec0: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
ced0: 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20  ( pDbPage ){.   
cee0: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
cef0: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
cf00: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
cf10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
cf20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
cf30: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
cf40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
cf50: 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72  n pages. If ther
cf60: 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
cf70: 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72  .** error, retur
cf80: 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  n ((unsigned int
cf90: 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )-1)..*/.static 
cfa0: 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f  Pgno btreePageco
cfb0: 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  unt(BtShared *pB
cfc0: 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  t){.  return pBt
cfd0: 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73  ->nPage;.}.u32 s
cfe0: 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50  qlite3BtreeLastP
cff0: 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  age(Btree *p){. 
d000: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d010: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
d020: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
d030: 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29  ((p->pBt->nPage)
d040: 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20 29  &0x8000000)==0 )
d050: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
d060: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
d070: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
d080: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
d090: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
d0a0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
d0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
d0c0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
d0d0: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
d0e0: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
d0f0: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
d100: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
d110: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
d120: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d130: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
d140: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
d150: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
d160: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
d170: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
d180: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
d190: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
d1a0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
d1b0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
d1c0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
d1d0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
d1e0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
d1f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
d200: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
d210: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
d220: 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
d230: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
d240: 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge     /* Write 
d250: 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72  the page pointer
d260: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
d270: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
d280: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d290: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
d2a0: 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
d2b0: 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
d2c0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
d2d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d2e0: 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
d2f0: 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
d300: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
d310: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
d320: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d330: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  {.      rc = btr
d340: 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
d350: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
d360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d370: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
d380: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
d390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
d3a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
d3b0: 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
d3c0: 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
d3d0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
d3e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
d400: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
d410: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
d420: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
d430: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
d440: 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
d450: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
d460: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
d470: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
d480: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
d490: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d4a0: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
d4b0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
d4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
d4d0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d4e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d4f0: 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
d500: 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
d510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
d520: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
d530: 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
d540: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
d550: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d560: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d570: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73  >mutex) );.    s
d580: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
d590: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d5a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
d5b0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
d5c0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
d5d0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
d5e0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
d5f0: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
d600: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
d610: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
d620: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
d630: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
d640: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
d650: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
d660: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
d670: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
d680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d690: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
d6a0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
d6b0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
d6c0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
d6d0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
d6e0: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
d6f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d700: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
d710: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
d720: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
d730: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
d740: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
d750: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
d760: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d770: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d780: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
d790: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
d7a0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
d7b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
d7c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
d7d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
d7e0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
d7f0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
d800: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
d810: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
d820: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
d830: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
d840: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
d850: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
d860: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
d870: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
d880: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
d890: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
d8a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
d8b0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
d8c0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
d8d0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
d8e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d8f0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
d900: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
d910: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
d920: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
d930: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
d940: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d950: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
d960: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
d970: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
d980: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
d990: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
d9a0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
d9b0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
d9c0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
d9d0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
d9e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
d9f0: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
da00: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
da10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
da20: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
da30: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
da40: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
da50: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
da60: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
da70: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
da80: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da90: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
daa0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
dab0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
dac0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
dad0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
dae0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
daf0: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
db00: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
db10: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
db20: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
db30: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
db40: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
db50: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
db60: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
db70: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
db80: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
db90: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
dba0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
dbb0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
dbc0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
dbd0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
dbe0: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
dbf0: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
dc00: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
dc10: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
dc20: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
dc30: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
dc40: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
dc50: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
dc60: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
dc70: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dc80: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
dc90: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
dca0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
dcb0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dcc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
dcd0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
dce0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
dcf0: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
dd00: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
dd10: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
dd20: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
dd30: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
dd40: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
dd50: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
dd60: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
dd70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
dd80: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
dd90: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
dda0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
ddb0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
ddc0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
ddd0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
dde0: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
ddf0: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
de00: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
de10: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
de20: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
de30: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
de40: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
de50: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
de60: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
de70: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
de80: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
de90: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
dea0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
deb0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
dec0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
ded0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
dee0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
def0: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
df00: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
df10: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
df20: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
df30: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
df40: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
df50: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
df60: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
df70: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
df80: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
df90: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
dfa0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
dfb0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
dfc0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
dfd0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
dfe0: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
dff0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
e000: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
e010: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
e020: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
e030: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
e040: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
e050: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e060: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
e070: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
e080: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e090: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
e0a0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
e0b0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
e0c0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
e0d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e0e0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e0f0: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
e100: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
e110: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
e120: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
e130: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
e140: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
e150: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
e160: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
e170: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
e180: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
e190: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
e1a0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
e1b0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
e1c0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
e1d0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
e1e0: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
e1f0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
e200: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
e210: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
e220: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
e230: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
e240: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
e250: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
e260: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
e270: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
e280: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
e290: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
e2a0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
e2b0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
e2c0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
e2d0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
e2e0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
e2f0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
e300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e310: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
e320: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
e330: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
e340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e350: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
e360: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
e370: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
e380: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
e390: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
e3a0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
e3b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e3c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
e3d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
e3e0: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
e3f0: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
e400: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
e410: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
e420: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
e430: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
e440: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
e450: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e460: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
e470: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
e480: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e490: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
e4a0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
e4b0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
e4c0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
e4d0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
e4e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
e4f0: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
e500: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
e510: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
e520: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
e530: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
e540: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
e550: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
e560: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
e570: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
e580: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
e590: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
e5a0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
e5b0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
e5c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
e5d0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
e5e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
e5f0: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
e600: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e620: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
e630: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
e640: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
e650: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
e660: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e670: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
e680: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
e690: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
e6a0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
e6b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e6c0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
e6d0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
e6e0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
e6f0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
e700: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
e710: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
e720: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
e730: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
e740: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
e750: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
e760: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
e770: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
e780: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
e790: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
e7a0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
e7b0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
e7c0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
e7d0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
e7e0: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
e7f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
e800: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
e810: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
e820: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e830: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
e840: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
e850: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
e860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e870: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
e880: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
e890: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
e8a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
e8b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e8c0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
e8d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e8e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
e8f0: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
e900: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
e910: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
e920: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
e930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
e940: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
e950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e960: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
e970: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
e980: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
e9c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
e9d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
e9e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e9f0: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
ea00: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
ea10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ea20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
ea30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
ea40: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
ea50: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
ea60: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ea70: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ea80: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ea90: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
eaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
eab0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
eac0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
ead0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
eae0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
eaf0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
eb00: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
eb10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eb20: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
eb30: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eb40: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
eb50: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eb60: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
eb70: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
eb80: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
eb90: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
eba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ebb0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
ebc0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
ebd0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ebe0: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
ebf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec00: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
ec10: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
ec20: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
ec30: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
ec40: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
ec50: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
ec60: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
ec70: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
ec80: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
ec90: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
eca0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
ecb0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
ecc0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ece0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ecf0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ed10: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ed20: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ed30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ed40: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ed50: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ed60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ed70: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ed80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ed90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
eda0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
edc0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
edd0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
ede0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
edf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ee00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ee10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ee20: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
ee30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ee40: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
ee50: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
ee60: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ee70: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
ee80: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
ee90: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
eea0: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
eeb0: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
eec0: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
eed0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
eee0: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
eef0: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
ef00: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
ef10: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
ef20: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
ef30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ef40: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
ef50: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
ef60: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
ef70: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
ef80: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
ef90: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
efa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
efb0: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
efc0: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
efd0: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
efe0: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
eff0: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
f000: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
f010: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
f020: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
f030: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
f040: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
f050: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
f060: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
f070: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
f080: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
f090: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f0a0: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
f0b0: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
f0c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f0d0: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
f0e0: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
f0f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f100: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
f110: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
f120: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
f130: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
f140: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
f150: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
f160: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
f170: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
f180: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
f190: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
f1a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
f1b0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
f1c0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
f1d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f1e0: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
f1f0: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
f200: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
f220: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
f230: 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
f240: 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
f250: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f260: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f270: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
f280: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
f290: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
f2a0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
f2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f2c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f2d0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
f2e0: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
f2f0: 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
f300: 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
f310: 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
f320: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
f330: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
f340: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
f350: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
f360: 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
f370: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
f380: 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
f390: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
f3a0: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
f3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
f3c0: 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
f3d0: 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
f3e0: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f3f0: 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
f400: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f410: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f420: 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
f430: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
f440: 65 6e 64 69 66 0a 20 20 20 20 70 42 74 2d 3e 70  endif.    pBt->p
f450: 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
f460: 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
f470: 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
f480: 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
f490: 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
f4a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
f4b0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
f4c0: 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
f4d0: 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
f4e0: 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
f4f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
f500: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
f510: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f520: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f530: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f540: 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
f550: 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
f560: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
f570: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
f580: 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
f590: 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
f5a0: 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
f5b0: 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
f5c0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
f5d0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
f5e0: 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
f5f0: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
f600: 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
f610: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
f620: 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
f630: 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
f640: 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
f650: 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
f660: 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
f670: 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
f680: 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
f690: 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
f6a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
f6b0: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
f6c0: 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
f6d0: 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
f6e0: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
f6f0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
f700: 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
f710: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
f720: 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
f730: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
f740: 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
f750: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
f760: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
f770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f780: 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
f790: 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
f7a0: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
f7b0: 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
f7c0: 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
f7d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f7e0: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
f7f0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
f800: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
f810: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
f820: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
f830: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
f840: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
f850: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
f860: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f870: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
f880: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
f890: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
f8a0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
f8b0: 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
f8c0: 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
f8d0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
f8e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
f8f0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
f900: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
f910: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
f920: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
f930: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
f940: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
f950: 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
f960: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
f970: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
f980: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f990: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
f9a0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
f9b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
f9c0: 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
f9d0: 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
f9e0: 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
f9f0: 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
fa00: 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
fa10: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
fa20: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
fa30: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74  red; ).      pBt
fa40: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
fa50: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
fa60: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
fa70: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
fa80: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
fa90: 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
faa0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
fab0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
fac0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
fad0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
fae0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
faf0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
fb00: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb10: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
fb20: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
fb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fb40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
fb50: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
fb60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
fb70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
fb80: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
fb90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
fba0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
fbb0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
fbc0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
fbd0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
fbe0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fbf0: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc00: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
fc10: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
fc20: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
fc30: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
fc40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fc50: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
fc60: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
fc70: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
fc80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fc90: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
fca0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
fcb0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
fcc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
fcd0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
fce0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
fcf0: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
fd00: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
fd10: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
fd20: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
fd30: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
fd40: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
fd50: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
fd60: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
fd70: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
fd80: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
fd90: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
fda0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
fdb0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
fdc0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
fdd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
fde0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
fdf0: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
fe00: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
fe10: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
fe20: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
fe30: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
fe40: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
fe50: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
fe60: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
fe70: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
fe80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
fe90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
fea0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
feb0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
fec0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
fed0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
fee0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
fef0: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
ff00: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
ff10: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
ff20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ff30: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
ff40: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
ff50: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
ff60: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ff70: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
ff80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
ff90: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
ffa0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
ffb0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
ffc0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
ffd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ffe0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
fff0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
10000 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
10010 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
10020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10030 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
10040 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
10050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
10060 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
10070 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
10080 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10090 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
100a0 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
100b0 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
100c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
100d0 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
100e0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
100f0 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
10100 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
10110 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
10120 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
10130 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
10140 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
10150 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
10160 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
10170 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
10180 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
10190 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
101a0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
101b0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
101c0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
101d0 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
101e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
101f0 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
10200 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _SIZE);.    }.  
10210 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65  }.  if( mutexOpe
10220 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  n ){.    assert(
10230 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10240 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29  eld(mutexOpen) )
10250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
10260 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
10270 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pen);.  }.  retu
10280 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10290 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
102a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
102b0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
102c0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
102d0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
102e0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
102f0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
10300 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
10310 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
10320 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10330 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
10340 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
10350 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
10360 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
10370 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
10380 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
10390 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
103a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
103b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
103c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
103d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
103e0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
103f0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
10400 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
10410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10420 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
10430 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10440 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
10450 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10460 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
10470 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
10480 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
10490 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
104a0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
104b0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
104c0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
104d0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
104e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
104f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
10500 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
10510 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10520 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10530 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
10540 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
10550 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
10560 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
10570 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
10580 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
10590 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
105a0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
105b0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
105c0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
105d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
105e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
105f0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
10600 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
10610 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10630 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
10640 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
10650 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
10660 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
10670 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
10680 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
10690 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
106a0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
106b0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
106c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
106d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
106e0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
106f0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
10700 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
10710 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
10720 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
10730 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
10740 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
10750 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
10760 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
10770 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
10780 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
10790 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
107a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
107b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
107c0 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
107d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
107e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
107f0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
10800 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
10810 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
10820 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
10830 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
10840 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
10850 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
10860 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
10870 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
10880 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
10890 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
108a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
108b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
108c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
108d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
108e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
108f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
10900 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
10910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10920 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10930 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10940 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
10950 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
10960 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
10970 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
10980 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
10990 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
109a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
109b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
109c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
109d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
109e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
109f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
10a00 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
10a10 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
10a20 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
10a30 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
10a40 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
10a50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
10a60 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
10a70 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
10a80 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
10a90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
10aa0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
10ab0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69  LITE_OK);.  sqli
10ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
10ad0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
10ae0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
10af0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
10b00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
10b10 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
10b20 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
10b30 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
10b40 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
10b50 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
10b60 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
10b70 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
10b80 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
10b90 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
10ba0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
10bb0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
10bc0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
10bd0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
10be0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
10bf0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
10c00 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
10c10 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
10c20 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
10c30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
10c40 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
10c50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
10c60 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
10c70 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
10c80 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
10c90 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
10ca0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
10cb0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
10cc0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10cd0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
10ce0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
10cf0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
10d00 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
10d10 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
10d20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
10d30 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
10d40 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
10d50 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
10d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
10d70 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
10d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10d90 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
10da0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
10db0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
10dc0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
10dd0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
10de0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
10df0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
10e00 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
10e10 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
10e20 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
10e30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
10e40 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
10e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
10e70 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
10e80 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10e90 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65  s allowed in the
10ea0 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
10eb0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
10ec0 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73 20   of cache pages 
10ed0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61 62  is set to the ab
10ee0 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20  solute.** value 
10ef0 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d  of mxPage.  If m
10f00 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  xPage is negativ
10f10 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  e, the pager wil
10f20 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79  l.** operate asy
10f30 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74  nchronously - it
10f40 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74   will not stop t
10f50 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a  o do fsync()s.**
10f60 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20   to insure data 
10f70 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
10f80 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20 62  e disk surface b
10f90 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75  efore.** continu
10fa0 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f  ing.  Transactio
10fb0 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66  ns still work if
10fc0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20   synchronous is 
10fd0 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  off,.** and the 
10fe0 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
10ff0 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66 20  be corrupted if 
11000 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  this program.** 
11010 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69 66  crashes.  But if
11020 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11030 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
11040 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
11050 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61 69  abrupt power fai
11060 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72  lure when synchr
11070 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68  onous is off, th
11080 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  e database.** co
11090 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61  uld be left in a
110a0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61  n inconsistent a
110b0 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65  nd unrecoverable
110c0 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68   state..** Synch
110d0 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20  ronous is on by 
110e0 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62  default so datab
110f0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
11100 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  s not.** normall
11110 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e  y a worry..*/.in
11120 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11130 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65  tCacheSize(Btree
11140 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
11150 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11160 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
11170 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11180 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11190 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
111a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
111b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
111c0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74  SetCachesize(pBt
111d0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
111e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
111f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
11200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11210 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
11220 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
11230 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
11240 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
11250 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
11260 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
11270 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
11280 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
11290 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
112a0 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
112b0 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
112c0 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
112d0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
112e0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
112f0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
11300 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
11310 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
11320 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
11330 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
11340 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
11350 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
11360 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
11370 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
11380 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
11390 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
113a0 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
113b0 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
113c0 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
113d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
113e0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
113f0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
11400 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  eeSetSafetyLevel
11410 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
11420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11430 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
11440 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
11450 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65  on */.  int leve
11460 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11470 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  * PRAGMA synchro
11480 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d  nous.  1=OFF, 2=
11490 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a  NORMAL, 3=FULL *
114a0 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  /.  int fullSync
114b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52  ,          /* PR
114c0 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20  AGMA fullfsync. 
114d0 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46 75 6c  */.  int ckptFul
114e0 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a 20 50  lSync       /* P
114f0 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74  RAGMA checkpoint
11500 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a  _fullfync */.){.
11510 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
11520 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
11530 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11540 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
11550 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11560 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65  ( level>=1 && le
11570 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69  vel<=3 );.  sqli
11580 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
11590 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
115a0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
115b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65  Bt->pPager, leve
115c0 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70  l, fullSync, ckp
115d0 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  tFullSync);.  sq
115e0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
115f0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
11600 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
11610 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
11620 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
11630 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
11640 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
11650 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
11660 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
11670 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
11680 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
11690 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
116a0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
116b0 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
116c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
116d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
116e0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
116f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11700 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11710 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
11720 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11730 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
11740 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
11750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11760 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
11770 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
11780 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11790 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
117a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
117b0 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
117c0 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
117d0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
117e0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
117f0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
11800 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
11810 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11830 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
11840 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
11850 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
11860 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
11870 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
11880 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
11890 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
118a0 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
118b0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
118c0 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
118d0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
118e0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
118f0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
11900 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
11910 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
11920 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
11930 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
11940 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
11950 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
11960 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
11970 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
11980 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
11990 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
119a0 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
119b0 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
119c0 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
119d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
119e0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
119f0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
11a00 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
11a10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
11a20 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
11a30 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
11a40 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
11a50 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
11a60 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
11a70 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
11a80 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
11a90 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
11aa0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
11ab0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
11ac0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
11ad0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
11ae0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
11af0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11b00 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
11b10 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
11b20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
11b30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11b40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11b50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
11b60 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
11b70 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
11b80 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
11b90 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
11ba0 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
11bb0 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
11bc0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
11bd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
11be0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
11bf0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
11c00 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
11c10 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
11c20 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
11c30 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
11c40 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
11c50 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
11c60 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
11c70 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
11c80 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
11c90 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
11ca0 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
11cb0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
11cc0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
11cd0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11ce0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
11cf0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
11d00 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
11d10 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
11d20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
11d30 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
11d40 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
11d50 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
11d60 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
11d70 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
11d80 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
11d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
11da0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
11db0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
11dc0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
11dd0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
11de0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
11df0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
11e00 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
11e10 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11e20 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11e40 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11e50 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11e60 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11e70 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11e80 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11e90 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
11ea0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64  geSize;.}..#if d
11eb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
11ec0 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69  S_CODEC) || defi
11ed0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11ee0 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  )./*.** This fun
11ef0 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
11f00 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11f10 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78  GetReserve(), ex
11f20 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
11f30 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
11f40 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72  ed if it is guar
11f50 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
11f60 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
11f70 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e  already.** held.
11f80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75  .**.** This is u
11f90 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65  seful in one spe
11fa0 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65  cial case in the
11fb0 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65   backup API code
11fc0 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20   where it is.** 
11fd0 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73  known that the s
11fe0 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  hared b-tree mut
11ff0 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20  ex is held, but 
12000 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  the mutex on the
12010 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61   .** database ha
12020 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a  ndle that owns *
12030 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69  p is not. In thi
12040 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65  s case if sqlite
12050 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a  3BtreeEnter().**
12060 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c   were to be call
12070 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c  ed, it might col
12080 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f  lide with some o
12090 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f  ther operation o
120a0 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  n the.** databas
120b0 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77  e handle that ow
120c0 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75  ns *p, causing u
120d0 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f  ndefined behavio
120e0 75 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ur..*/.int sqlit
120f0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
12100 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
12110 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
12120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12130 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
12140 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  );.  return p->p
12150 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
12160 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
12170 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  e;.}.#endif /* S
12180 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20  QLITE_HAS_CODEC 
12190 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  || SQLITE_DEBUG 
121a0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
121b0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
121c0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
121d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
121e0 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
121f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
12200 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
12210 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
12220 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
12230 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
12240 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
12250 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
12260 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
12270 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
12280 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
12290 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
122a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
122b0 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
122c0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
122d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
122e0 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
122f0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12300 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12310 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12320 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12330 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12340 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
12350 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
12360 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
12370 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
12380 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
12390 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
123a0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
123b0 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
123c0 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
123d0 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
123e0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
123f0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12400 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12410 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12420 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12430 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12450 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
12460 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
12470 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
12480 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
12490 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
124a0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
124b0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53  *.** Set the BTS
124c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66  _SECURE_DELETE f
124d0 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69  lag if newFlag i
124e0 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65  s 0 or 1.  If ne
124f0 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20  wFlag is -1,.** 
12500 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61  then make no cha
12510 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65  nges.  Always re
12520 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
12530 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  f the BTS_SECURE
12540 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69  _DELETE.** setti
12550 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ng after the cha
12560 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nge..*/.int sqli
12570 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65  te3BtreeSecureDe
12580 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69  lete(Btree *p, i
12590 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69  nt newFlag){.  i
125a0 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt b;.  if( p==0
125b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
125c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
125d0 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c  (p);.  if( newFl
125e0 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ag>=0 ){.    p->
125f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
12600 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c   ~BTS_SECURE_DEL
12610 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77  ETE;.    if( new
12620 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62  Flag ) p->pBt->b
12630 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
12640 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
12650 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74  } .  b = (p->pBt
12660 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
12670 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21  _SECURE_DELETE)!
12680 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  =0;.  sqlite3Btr
12690 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
126a0 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66  turn b;.}.#endif
126b0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
126c0 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
126d0 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
126e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
126f0 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
12700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
12710 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
12720 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
12730 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
12740 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
12750 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
12760 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
12770 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
12780 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
12790 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
127a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
127b0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
127c0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
127d0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
127e0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
127f0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
12800 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
12810 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
12820 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
12830 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
12840 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
12850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12860 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
12870 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
12880 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
12890 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
128a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
128b0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
128c0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
128d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
128e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
128f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
12900 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
12910 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
12920 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
12930 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
12940 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
12950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
12960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
12970 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
12980 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
12990 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
129a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
129b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
129c0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
129d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
129e0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
129f0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
12a00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
12a10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
12a20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
12a30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
12a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12a50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
12a60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
12a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12a80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
12a90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
12aa0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
12ab0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
12ac0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12ad0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
12ae0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
12af0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12b00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
12b10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
12b20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
12b30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
12b40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
12b50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
12b60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
12b80 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ndif.}.../*.** G
12b90 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  et a reference t
12ba0 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20  o pPage1 of the 
12bb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
12bc0 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73  This will.** als
12bd0 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64  o acquire a read
12be0 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c  lock on that fil
12bf0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
12c00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
12c10 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74  n success.  If t
12c20 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  he file is not a
12c30 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  .** well-formed 
12c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
12c50 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  hen SQLITE_CORRU
12c60 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  PT is returned..
12c70 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
12c80 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
12c90 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f  e database is lo
12ca0 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f  cked.  SQLITE_NO
12cb0 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  MEM.** is return
12cc0 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74  ed if we run out
12cd0 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a   of memory. .*/.
12ce0 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42  static int lockB
12cf0 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70  tree(BtShared *p
12d00 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Bt){.  int rc;  
12d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12d20 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12d30 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  subfunctions */.
12d40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12d50 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31  1;     /* Page 1
12d60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12d70 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12d80 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
12d90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
12da0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
12db0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  se */.  int nPag
12dc0 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20  eFile = 0;   /* 
12dd0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
12de0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
12df0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12e00 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f  ageHeader;     /
12e10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12e20 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12e30 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68  e according to h
12e40 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  dr */..  assert(
12e50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12e60 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
12e80 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20  ->pPage1==0 );. 
12e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12ea0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74  erSharedLock(pBt
12eb0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  ->pPager);.  if(
12ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
12ee0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12ef0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
12f00 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
12f10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
12f20 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
12f30 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
12f40 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
12f50 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
12f60 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
12f70 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
12f80 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61  ile. .  */.  nPa
12f90 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72  ge = nPageHeader
12fa0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
12fb0 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
12fc0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  a);.  sqlite3Pag
12fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12fe0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46  >pPager, &nPageF
12ff0 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67  ile);.  if( nPag
13000 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32  e==0 || memcmp(2
13010 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  4+(u8*)pPage1->a
13020 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50  Data, 92+(u8*)pP
13030 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d  age1->aData,4)!=
13040 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  0 ){.    nPage =
13050 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a   nPageFile;.  }.
13060 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
13070 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a  .    u32 pageSiz
13080 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c  e;.    u32 usabl
13090 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70  eSize;.    u8 *p
130a0 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61  age1 = pPage1->a
130b0 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53  Data;.    rc = S
130c0 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
130d0 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
130e0 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
130f0 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
13100 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
13110 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
13120 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
13130 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
13140 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
13150 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
13160 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13170 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
13180 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
13190 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
131a0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
131b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
131c0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
131d0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
131e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
131f0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
13200 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13210 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
13220 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13230 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
13240 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
13250 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
13260 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
13270 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
13280 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
13290 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
132a0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
132b0 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
132c0 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
132d0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
132e0 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
132f0 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
13300 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
13310 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
13320 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
13330 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
13340 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
13350 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
13360 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
13370 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
13380 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
13390 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
133a0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
133b0 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
133c0 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
133d0 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
133e0 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
133f0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
13400 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
13410 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
13420 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
13430 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
13440 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
13450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13460 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
13470 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
13480 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
13490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
134a0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
134b0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
134c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
134d0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
134e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
134f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
13500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13510 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
13520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
13530 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e  OTADB;.    }.#en
13540 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
13550 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  maximum embedded
13560 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
13570 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20  e exactly 25%.  
13580 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a  And the minimum.
13590 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20      ** embedded 
135a0 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
135b0 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20   12.5% for both 
135c0 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f  leaf-data and no
135d0 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20  n-leaf-data..   
135e0 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   ** The original
135f0 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20   design allowed 
13600 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f  these amounts to
13610 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66   vary, but as of
13620 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
13630 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72  3.6.0, we requir
13640 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78  e them to be fix
13650 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
13660 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31  f( memcmp(&page1
13670 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c  [21], "\100\040\
13680 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20  040",3)!=0 ){.  
13690 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
136a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
136b0 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  }.    pageSize =
136c0 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
136d0 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
136e0 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  );.    if( ((pag
136f0 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
13700 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
13710 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
13720 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
13730 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
13740 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
13750 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13760 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13770 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
13780 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
13790 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
137a0 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
137b0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
137c0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
137d0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
137e0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
137f0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
13800 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
13810 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
13820 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
13830 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
13840 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
13850 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
13860 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
13870 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
13880 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
13890 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
138a0 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
138b0 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
138c0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
138d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
138e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
138f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
13900 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
13910 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
13920 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
13930 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
13940 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
13950 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
13960 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
13970 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
13980 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13990 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
139a0 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
139b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
139c0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
139d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
139e0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a10 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
13a20 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
13a30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
13a40 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
13a50 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
13a60 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
13a70 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
13a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
13a90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13aa0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
13ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13ac0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13ad0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
13ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
13af0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
13b00 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
13b10 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13b20 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
13b30 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
13b40 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
13b50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13b60 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
13b70 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13b80 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
13b90 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13ba0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
13bb0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
13bc0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
13bd0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
13be0 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
13bf0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
13c00 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
13c10 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
13c20 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
13c30 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
13c40 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
13c50 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
13c60 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
13c70 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
13c80 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
13c90 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
13ca0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
13cb0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
13cc0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
13cd0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
13ce0 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
13cf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13d00 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
13d10 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
13d20 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
13d30 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
13d40 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
13d50 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
13d60 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
13d70 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
13d80 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
13d90 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
13da0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
13db0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
13dc0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
13dd0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
13de0 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
13df0 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
13e00 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
13e10 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
13e20 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
13e30 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
13e40 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13e50 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
13e60 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13e70 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
13e80 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
13e90 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
13ea0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
13eb0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
13ec0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
13ed0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
13ee0 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
13ef0 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
13f00 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
13f10 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
13f20 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
13f30 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
13f40 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
13f50 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
13f60 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
13f70 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
13f80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
13f90 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
13fa0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
13fb0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
13fc0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
13fd0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
13fe0 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
13ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
14000 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
14010 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
14020 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
14030 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
14040 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
14050 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
14060 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
14070 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
14080 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
14090 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
140a0 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
140b0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
140c0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
140d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
140e0 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
140f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
14100 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
14110 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
14120 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
14130 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
14140 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
14150 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
14160 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
14170 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14180 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
14190 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
141a0 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
141b0 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
141c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
141d0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
141e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
141f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
14200 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
14210 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
14220 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
14230 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
14240 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
14250 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
14260 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
14270 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
14280 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14290 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
142a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
142b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
142c0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
142d0 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ta );.    releas
142e0 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  ePage(pBt->pPage
142f0 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61  1);.    pBt->pPa
14300 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge1 = 0;.  }.}..
14310 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
14320 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
14330 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
14340 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
14350 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
14360 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
14370 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
14380 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14390 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
143a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
143b0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
143c0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
143d0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
143e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
143f0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
14400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14410 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
14420 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
14430 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
14440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14450 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
14460 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
14470 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
14480 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
14490 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
144a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
144b0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
144c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
144d0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
144e0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
144f0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
14500 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
14510 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
14520 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
14530 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
14540 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
14550 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
14560 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
14570 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
14580 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
14590 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
145a0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
145b0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
145c0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
145d0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
145e0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
145f0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
14600 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
14610 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
14620 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
14630 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
14640 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
14650 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
14660 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
14670 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
14680 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
14690 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
146a0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
146b0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
146c0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
146d0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
146e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
146f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
14700 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
14710 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
14720 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
14730 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14740 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
14750 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14760 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
14770 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
14780 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
14790 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
147a0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
147b0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
147c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
147d0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
147e0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
147f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14800 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
14810 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
14820 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
14830 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
14840 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
14850 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
14860 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
14870 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
14880 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
14890 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
148a0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
148b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
148c0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
148d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
148e0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
148f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
14900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14910 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
14920 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
14930 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
14940 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14950 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14960 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
14970 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
14980 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
14990 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
149a0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
149b0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
149c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
149d0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
149e0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
149f0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
14a00 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14a10 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
14a20 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
14a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
14a40 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
14a50 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
14a60 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
14a70 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
14a80 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
14a90 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
14aa0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
14ab0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
14ac0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
14ad0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
14ae0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
14af0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
14b00 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
14b10 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
14b20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
14b30 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
14b40 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
14b50 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
14b60 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
14b70 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
14b80 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
14b90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
14ba0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
14bb0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
14bc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14bd0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
14be0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
14bf0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
14c00 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14c10 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
14c20 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
14c30 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
14c40 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c50 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
14c60 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
14c70 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
14c80 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
14c90 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
14ca0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
14cb0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
14cc0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
14cd0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
14ce0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
14cf0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
14d00 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
14d10 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
14d20 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
14d30 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
14d40 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
14d50 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
14d60 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
14d70 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
14d80 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
14d90 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
14da0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
14db0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
14dc0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
14dd0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
14de0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
14df0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
14e00 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
14e10 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
14e20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
14e30 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
14e40 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
14e50 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
14e60 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
14e70 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
14e80 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
14e90 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
14ea0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
14eb0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
14ec0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
14ed0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
14ee0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
14ef0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
14f00 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
14f10 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
14f20 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14f30 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
14f40 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
14f50 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
14f60 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
14f70 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
14f80 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
14f90 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
14fa0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
14fb0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
14fc0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
14fd0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
14fe0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
14ff0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
15000 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15010 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
15020 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
15030 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70 42  ){.  sqlite3 *pB
15040 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68  lock = 0;.  BtSh
15050 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15060 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
15070 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c  QLITE_OK;..  sql
15080 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15090 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
150a0 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
150b0 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6c   the btree is al
150c0 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74 65  ready in a write
150d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72  -transaction, or
150e0 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65   it.  ** is alre
150f0 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72  ady in a read-tr
15100 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20  ansaction and a 
15110 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
15120 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74  .  ** is request
15130 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ed, this is a no
15140 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
15150 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
15160 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69  S_WRITE || (p->i
15170 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45  nTrans==TRANS_RE
15180 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20 29  AD && !wrflag) )
15190 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  {.    goto trans
151a0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  _begun;.  }..  /
151b0 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
151c0 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
151d0 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
151e0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
151f0 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
15200 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
15210 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
15220 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
15230 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15240 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
15250 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
15260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15270 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
15280 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
15290 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
152a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
152b0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
152c0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
152d0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
152e0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
152f0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
15300 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
15310 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
15320 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
15330 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
15340 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
15350 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15360 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28 70  _WRITE).   || (p
15370 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
15380 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
15390 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
153a0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
153b0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
153c0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
153d0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
153e0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
153f0 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15400 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15410 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15420 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15430 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15440 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15450 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
15460 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15470 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
15480 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
15490 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
154a0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
154b0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
154c0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
154d0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
154e0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
154f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15500 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15510 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15520 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15530 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15540 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15550 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
15560 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
15570 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
15580 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
15590 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
155a0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
155b0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
155c0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
155d0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
155e0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
155f0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15600 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15610 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15620 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
15630 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
15640 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
15650 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
15660 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
15670 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
15680 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
15690 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
156a0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
156b0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
156c0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
156d0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
156e0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
156f0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
15700 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
15710 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
15720 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
15730 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
15740 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
15750 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
15760 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
15770 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
15780 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
15790 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
157a0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
157b0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
157c0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
157d0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
157e0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
157f0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
15800 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
15810 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
15820 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
15830 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
15840 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
15850 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
15860 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
15870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15880 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
15890 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
158a0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
158b0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
158c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
158d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
158e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
158f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15900 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15910 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15920 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15930 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15940 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15960 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
15970 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
15980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15990 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
159a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
159b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
159c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
159d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
159e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
159f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15a00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15a10 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15a20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15a30 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15a40 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
15a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15a60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15a70 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
15a80 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
15a90 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
15aa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
15ab0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
15ac0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
15ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
15ae0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
15af0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
15b00 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
15b10 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
15b20 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
15b30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15b40 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
15b50 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
15b60 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
15b70 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
15b80 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
15b90 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
15ba0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
15bb0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
15bc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
15bd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15be0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
15bf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
15c00 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
15c10 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
15c20 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
15c30 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
15c40 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
15c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15c60 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
15c70 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
15c80 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
15c90 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
15ca0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
15cb0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
15cc0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
15cd0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
15ce0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15cf0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
15d00 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
15d10 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
15d20 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
15d30 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
15d40 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
15d50 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
15d60 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
15d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15d80 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
15d90 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
15da0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
15db0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
15dc0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
15dd0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
15de0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
15df0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
15e00 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
15e10 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
15e20 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15e30 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
15e40 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
15e50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15e60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15e70 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
15e80 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
15e90 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
15ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15eb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15ec0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
15ed0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15ef0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
15f00 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
15f10 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
15f20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15f40 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
15f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15f60 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
15f70 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
15f80 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
15f90 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
15fa0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
15fb0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
15fc0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
15fd0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
15fe0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
15ff0 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
16000 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16010 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
16020 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
16030 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
16040 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
16050 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
16060 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
16070 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
16080 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
16090 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
160a0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
160b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
160c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
160d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
160e0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
160f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
16100 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
16110 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
16120 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
16130 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
16140 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
16150 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
16160 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
16170 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
16180 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
16190 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
161a0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
161b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
161c0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
161d0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
161e0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
16210 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
16220 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
16250 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
16260 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16290 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
162a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
162b0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
162c0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
162d0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
162e0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
162f0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
16300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16310 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
16320 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
16330 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
16340 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
16350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16360 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
16370 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
16380 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
16390 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
163a0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
163b0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
163c0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
163d0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
163e0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
163f0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
16400 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
16410 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
16420 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16430 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
16440 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
16450 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
16460 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
16470 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
16480 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
16490 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
164a0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
164b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
164c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
164d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
164e0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
164f0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
16500 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
16510 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
16520 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16530 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
16540 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16550 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16560 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
16570 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
16580 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
16590 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
165a0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
165b0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
165c0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
165d0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
165e0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
165f0 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
16600 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
16610 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
16620 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
16630 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16640 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16650 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
16660 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
16670 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
16680 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
16690 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
166a0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
166b0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
166c0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
166d0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
166e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
166f0 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
16700 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
16710 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
16720 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16730 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
16740 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
16750 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
16760 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
16770 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16780 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
16790 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
167a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
167b0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
167c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
167d0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
167e0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
167f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16800 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
16810 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
16820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16830 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
16840 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
16850 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
16860 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16870 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
16880 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
16890 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
168a0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
168b0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
168c0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
168d0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
168e0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
168f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16900 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16910 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
16920 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16930 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
16940 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
16950 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
16960 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
16970 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
16980 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
16990 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
169a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
169b0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
169c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
169d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
169e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
169f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
16a00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
16a10 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
16a20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
16a30 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
16a40 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
16a50 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
16a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
16a70 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
16a80 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
16a90 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
16aa0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
16ab0 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
16ac0 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
16ad0 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
16ae0 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
16af0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
16b00 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
16b10 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
16b20 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
16b30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
16b60 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
16b70 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
16b80 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
16b90 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
16ba0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16bc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
16bd0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
16be0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
16bf0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
16c00 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
16c10 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
16c20 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
16c30 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
16c40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
16c50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16c60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16c70 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
16c80 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
16c90 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
16ca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
16cb0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
16cc0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
16cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16ce0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
16cf0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
16d00 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
16d10 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
16d20 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
16d30 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
16d40 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
16d50 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
16d60 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
16d70 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
16d80 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
16d90 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
16da0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
16db0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
16dc0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
16dd0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
16de0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
16df0 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
16e00 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
16e10 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
16e20 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
16e30 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
16e40 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
16e50 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
16e60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
16e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
16e80 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
16e90 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
16ea0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
16eb0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
16ec0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
16ed0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16ee0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
16ef0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
16f00 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
16f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
16f20 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
16f30 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
16f40 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16f50 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
16f60 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
16f70 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
16f80 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
16f90 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
16fa0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
16fb0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
16fc0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16fd0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
16fe0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
16ff0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
17000 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
17010 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
17020 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
17030 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
17040 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
17050 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
17060 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17070 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
17080 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
17090 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
170a0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
170b0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
170c0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
170d0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
170e0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
170f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17100 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
17110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
17120 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
17130 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
17140 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
17150 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
17160 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
17170 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
17180 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
17190 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
171a0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
171b0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
171c0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
171d0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
171e0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
171f0 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
17200 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
17210 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
17220 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
17230 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
17240 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17260 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
17270 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
17280 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
17290 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
172a0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
172b0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
172c0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
172d0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
172e0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
172f0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
17300 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
17310 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
17320 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
17330 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
17340 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
17350 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
17360 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
17370 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
17380 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
17390 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
173a0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
173b0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
173c0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
173d0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
173e0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
173f0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
17400 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
17410 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
17420 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
17430 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
17440 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
17450 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
17460 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
17470 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
17480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17490 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
174a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
174b0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
174c0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
174d0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
174e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
174f0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
17500 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
17510 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
17520 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
17530 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
17540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
17560 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17570 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
17580 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
17590 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
175a0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
175b0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
175c0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
175d0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
175e0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
175f0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
17600 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
17610 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
17620 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
17630 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17640 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
17650 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
17660 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
17670 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
17680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17690 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
176a0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
176b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
176c0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
176d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
176e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
176f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
17700 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
17710 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17720 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
17730 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
17740 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
17750 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
17760 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
17770 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
17780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17790 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
177a0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
177b0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
177c0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
177d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
177e0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
177f0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
17800 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
17810 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
17820 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
17830 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
17840 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
17850 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
17860 20 75 38 29 3b 0a 23 64 65 66 69 6e 65 20 42 54   u8);.#define BT
17870 41 4c 4c 4f 43 5f 41 4e 59 20 20 20 30 20 20 20  ALLOC_ANY   0   
17880 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
17890 61 74 65 20 61 6e 79 20 70 61 67 65 20 2a 2f 0a  ate any page */.
178a0 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
178b0 45 58 41 43 54 20 31 20 20 20 20 20 20 20 20 20  EXACT 1         
178c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 65 78    /* Allocate ex
178d0 61 63 74 20 70 61 67 65 20 69 66 20 70 6f 73 73  act page if poss
178e0 69 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ible */.#define 
178f0 42 54 41 4c 4c 4f 43 5f 4c 45 20 20 20 20 32 20  BTALLOC_LE    2 
17900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
17910 6f 63 61 74 65 20 61 6e 79 20 70 61 67 65 20 3c  ocate any page <
17920 3d 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  = the parameter 
17930 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72  */../*.** Perfor
17940 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20  m a single step 
17950 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  of an incrementa
17960 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63  l-vacuum. If suc
17970 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a  cessful, return.
17980 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ** SQLITE_OK. If
17990 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72   there is no wor
179a0 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65  k to do (and the
179b0 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20  refore no point 
179c0 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74  in .** calling t
179d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
179e0 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
179f0 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20  TE_DONE. Or, if 
17a00 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  an error .** occ
17a10 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65  urs, return some
17a20 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
17a30 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70  e..**.** More sp
17a40 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66  ecificly, this f
17a50 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
17a60 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
17a70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
17a80 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
17a90 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
17aa0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
17ab0 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
17ac0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
17ad0 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
17ae0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
17af0 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
17b00 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
17b10 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
17b20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
17b30 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
17b40 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
17b50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
17b60 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
17b70 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
17b80 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
17b90 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
17ba0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
17bb0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
17bc0 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
17bd0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
17be0 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
17bf0 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
17c00 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
17c10 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
17c20 6d 2d 6f 6e 2d 63 6f 6d 6d 6d 69 74 20 0a 2a 2a  m-on-commmit .**
17c30 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
17c40 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
17c50 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
17c60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
17c70 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
17c80 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
17c90 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
17ca0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
17cb0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
17cc0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
17cd0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
17ce0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
17cf0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
17d00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
17d10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17d20 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
17d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
17d40 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
17d50 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
17d60 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17d70 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
17d80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17d90 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
17da0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
17db0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
17dc0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
17dd0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
17de0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
17df0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
17e00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17e10 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17e20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
17e30 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
17e40 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
17e50 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
17e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17e70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17e80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
17e90 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17ea0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
17eb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17ec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17ed0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
17ee0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
17ef0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
17f00 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
17f10 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
17f20 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
17f30 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
17f40 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
17f50 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
17f60 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
17f70 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
17f80 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
17f90 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
17fa0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
17fb0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
17fc0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
17fd0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
17fe0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
17ff0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
18000 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
18010 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
18020 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
18030 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
18040 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
18050 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
18060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
18070 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18080 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
18090 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
180a0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
180b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
180c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
180d0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
180e0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
180f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
18100 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
18110 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
18120 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
18130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
18140 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
18150 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
18160 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
18170 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
18180 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
18190 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
181a0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
181b0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
181c0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
181d0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
181e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
181f0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
18200 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
18210 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
18220 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
18230 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
18240 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
18250 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
18260 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
18270 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
18280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18290 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
182a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
182b0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
182c0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
182d0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
182e0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
182f0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
18300 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
18310 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
18320 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
18330 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
18340 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18350 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
18360 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
18370 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
18380 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
18390 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
183a0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
183b0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
183c0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
183d0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
183e0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
183f0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
18400 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
18410 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
18420 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
18430 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
18440 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
18450 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
18460 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
18470 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
18480 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
18490 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
184a0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
184b0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
184c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
184d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
184e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
184f0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
18500 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18520 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18530 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
18540 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
18550 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
18560 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18570 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
18580 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
18590 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
185a0 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
185b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
185c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
185d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
185e0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
185f0 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
18600 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
18610 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b  reePg, nFin!=0);
18620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18630 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
18640 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
18650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18660 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18670 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
18680 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
18690 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  mit==0 ){.    iL
186a0 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
186b0 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
186c0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
186d0 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
186e0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
186f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
18700 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
18710 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
18720 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
18730 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
18740 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
18750 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
18760 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
18770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18780 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
187a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
187b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
187c0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
187d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
187e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
187f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18820 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
18830 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
18840 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
18850 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
18860 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
18870 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
18880 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
18890 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
188a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
188b0 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
188c0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
188d0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
188e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
188f0 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
18900 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
18910 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
18920 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
18930 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
18940 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
18950 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
18960 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
18970 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
18980 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
18990 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
189a0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
189b0 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
189c0 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
189d0 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
189e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
189f0 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
18a00 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
18a10 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
18a20 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
18a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18a40 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
18a50 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
18a60 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
18a90 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
18aa0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
18ab0 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
18ac0 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
18ad0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
18ae0 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
18af0 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
18b00 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
18b10 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
18b20 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
18b30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
18b40 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
18b50 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18b60 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
18b70 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
18b80 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
18b90 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
18ba0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18bb0 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
18bc0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 46 69 6e 3e  .  }.  if( nFin>
18bd0 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
18be0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18bf0 50 54 3b 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46  PT;..  return nF
18c00 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77  in;.}../*.** A w
18c10 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
18c20 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20   must be opened 
18c30 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74  before calling t
18c40 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
18c50 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73   It performs a s
18c60 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f  ingle unit of wo
18c70 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e  rk towards an in
18c80 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
18c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
18ca0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18cb0 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66  m is finished af
18cc0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
18cd0 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51  n has run,.** SQ
18ce0 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
18cf0 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20  urned. If it is 
18d00 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75  not finished, bu
18d10 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
18d20 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
18d30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
18d40 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
18d50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
18d60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
18d70 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
18d80 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
18d90 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
18da0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
18db0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18dc0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18dd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
18de0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
18df0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
18e00 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
18e10 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
18e20 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
18e30 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
18e40 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
18e50 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67  nOrig = btreePag
18e60 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
18e70 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65   Pgno nFree = ge
18e80 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
18e90 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
18ea0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
18eb0 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
18ec0 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
18ed0 0a 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ..    if( nFin<n
18ee0 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  Orig ){.      in
18ef0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
18f00 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
18f10 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
18f20 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
18f30 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
18f40 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18f70 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
18f80 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
18f90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
18fa0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18fb0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
18fc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
18fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18fe0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
18ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
19000 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19010 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19030 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19040 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
19050 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
19060 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
19070 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
19080 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
19090 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
190a0 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
190b0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
190c0 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
190d0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
190e0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
190f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
19100 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
19110 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
19120 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
19130 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
19140 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
19150 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
19160 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
19170 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
19180 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
19190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
191a0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
191b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
191c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
191d0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
191e0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
191f0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
19200 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
19210 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
19220 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
19230 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19240 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19250 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
19260 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
19270 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
19280 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
19290 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
192a0 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
192b0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
192c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
192d0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
192e0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
192f0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
19300 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
19310 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19320 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
19330 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
19340 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
19350 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
19360 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
19370 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
19380 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
19390 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
193a0 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
193b0 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
193c0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
193d0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
193e0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
193f0 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
19400 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
19410 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
19420 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
19430 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
19440 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
19450 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
19460 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
19470 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
19480 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
19490 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
194a0 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
194b0 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
194c0 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
194d0 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
194e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
194f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19500 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
19510 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
19520 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
19530 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
19540 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
19550 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
19560 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
19570 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
19580 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19590 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
195a0 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72     for(iFree=nOr
195b0 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26  ig; iFree>nFin &
195c0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
195d0 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20   iFree--){.     
195e0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
195f0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
19600 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d  iFree, 1);.    }
19610 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
19620 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d  LITE_DONE || rc=
19630 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e  =SQLITE_OK) && n
19640 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
19650 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19660 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
19670 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
19680 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
19690 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
196a0 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [32], 0);.      
196b0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
196c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
196d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
196e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
196f0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46  1->aData[28], nF
19700 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  in);.      sqlit
19710 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
19720 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
19730 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
19740 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e  Bt->nPage = nFin
19750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
19780 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
19790 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
197a0 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
197b0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
197c0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
197d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
197e0 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20  #else /* ifndef 
197f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
19800 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69  VACUUM */.# defi
19810 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61  ne setChildPtrma
19820 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ps(x) SQLITE_OK.
19830 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
19840 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
19850 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
19860 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
19870 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
19880 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
19890 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
198a0 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
198b0 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
198c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
198d0 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
198e0 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
198f0 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
19900 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
19910 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
19920 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
19930 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
19940 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
19950 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
19960 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
19970 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
19980 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
19990 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
199a0 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
199b0 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
199c0 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
199d0 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
199e0 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
199f0 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
19a00 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
19a10 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
19a20 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
19a30 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
19a40 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
19a50 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
19a60 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
19a70 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
19a80 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
19a90 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
19aa0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
19ab0 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
19ac0 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
19ad0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
19ae0 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68  haseTwo() for th
19af0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
19b00 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20  f the.** commit 
19b10 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
19b20 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
19b30 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d  -op if no write-
19b40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
19b50 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20  urrently active 
19b60 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  on pBt..**.** Ot
19b70 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68  herwise, sync th
19b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19b90 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42  for the btree pB
19ba0 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  t. zMaster point
19bb0 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  s to.** the name
19bc0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
19bd0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
19be0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
19bf0 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64   into the.** ind
19c00 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
19c10 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c  file, or is NULL
19c20 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20  , indicating no 
19c30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19c40 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20  ile .** (single 
19c50 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
19c60 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  tion)..**.** Whe
19c70 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
19c80 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
19c90 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65  rnal should alre
19ca0 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  ady have been.**
19cb0 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61   created, popula
19cc0 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f  ted with this jo
19cd0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e  urnal pointer an
19ce0 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
19cf0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ..**.** Once thi
19d00 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  s is routine has
19d10 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f   returned, the o
19d20 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72  nly thing requir
19d30 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20  ed to commit.** 
19d40 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
19d50 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64  ction for this d
19d60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19d70 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
19d80 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
19d90 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
19da0 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a  PhaseOne(Btree *
19db0 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
19dc0 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
19dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19de0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
19df0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
19e00 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
19e10 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
19e20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
19e30 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  r(p);.#ifndef SQ
19e40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
19e50 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
19e60 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
19e70 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
19e80 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
19e90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19eb0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
19ec0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
19ed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19ee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
19ef0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
19f00 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
19f10 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
19f20 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
19f30 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
19f40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
19f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19f60 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19f70 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
19f80 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
19f90 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
19fa0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
19fb0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
19fc0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
19fd0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
19fe0 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
19ff0 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1a000 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1a010 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1a020 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1a030 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
1a040 28 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43  (p) );..  btreeC
1a050 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
1a060 42 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  Bt);.  if( p->in
1a070 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1a080 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76   && p->db->activ
1a090 65 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20  eVdbeCnt>1 ){.  
1a0a0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1a0b0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1a0c0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1a0d0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1a0e0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1a0f0 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1a100 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1a110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1a120 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1a130 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1a140 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1a150 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1a160 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1a170 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1a180 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1a190 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1a1a0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1a1b0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1a1c0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1a1d0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1a1e0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1a1f0 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1a200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1a210 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1a220 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1a230 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1a240 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1a250 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1a260 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1a270 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1a280 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1a290 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1a2a0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1a2b0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1a2c0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1a2d0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1a2e0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1a2f0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1a300 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1a310 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1a320 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1a330 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1a340 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1a350 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1a360 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1a370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a380 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1a390 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1a3a0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1a3b0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1a3c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1a3d0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1a3e0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1a3f0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1a400 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1a410 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1a420 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1a430 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1a440 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1a450 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1a470 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1a480 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1a490 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1a4a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1a4b0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1a4c0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1a4d0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1a4e0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1a4f0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1a500 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1a510 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1a520 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1a530 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1a540 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1a550 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1a560 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a570 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1a580 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1a590 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1a5a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1a5b0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1a5c0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1a5d0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1a5e0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1a5f0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1a600 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1a610 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1a620 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1a630 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1a640 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1a650 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1a660 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1a670 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1a680 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1a690 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1a6a0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1a6b0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1a6c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1a6d0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1a6e0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1a6f0 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1a700 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1a710 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1a720 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1a730 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1a740 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1a750 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1a760 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1a770 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1a780 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1a790 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1a7a0 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1a7b0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1a7c0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1a7d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1a7e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1a7f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1a800 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a810 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1a820 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1a830 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a840 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1a850 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1a860 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1a870 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1a880 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1a890 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1a8a0 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1a8b0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1a8c0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1a8d0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1a8e0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1a8f0 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1a900 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1a910 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1a920 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1a930 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1a940 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1a950 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1a960 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1a970 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1a980 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1a990 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1a9a0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1a9b0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1a9c0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1a9d0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1a9e0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1a9f0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1aa00 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1aa10 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1aa20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1aa30 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1aa40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aa50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1aa60 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1aa70 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1aa80 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1aa90 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1aaa0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1aab0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1aac0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1aad0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1aae0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1aaf0 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1ab00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1ab10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ab20 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1ab30 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1ab40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ab50 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1ab60 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ab70 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1ab80 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1ab90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
1aba0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1abb0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1abc0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
1abd0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1abe0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
1abf0 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
1ac00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1ac10 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
1ac20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ac30 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1ac40 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1ac50 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1ac60 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1ac70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1ac80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1ac90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1aca0 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1acb0 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1acc0 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1acd0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1ace0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1acf0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1ad00 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1ad10 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1ad20 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1ad30 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1ad40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1ad50 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ad60 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1ad70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1ad80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ad90 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ada0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1adb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1adc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74  e number of writ
1add0 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  e-cursors open o
1ade0 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54  n this handle. T
1adf0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
1ae00 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
1ae10 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
1ae20 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
1ae30 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
1ae40 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
1ae50 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1ae60 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1ae70 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63  utine, a write-c
1ae80 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72  ursor is any cur
1ae90 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63  sor that.** is c
1aea0 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e  apable of writin
1aeb0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65  g to the databse
1aec0 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
1aed0 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20  e cursor was.** 
1aee0 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
1aef0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  d for writing an
1af00 64 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  d the cursor has
1af10 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64   not be disabled
1af20 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74  .** by having it
1af30 73 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20  s state changed 
1af40 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e  to CURSOR_FAULT.
1af50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1af60 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1af70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1af80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
1af90 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
1afa0 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
1afb0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
1afc0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
1afd0 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1afe0 77 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e  wrFlag && pCur->
1aff0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
1b000 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
1b010 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
1b020 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1b030 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1b040 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1b050 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1b060 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1b070 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1b080 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74  ery cursor on Bt
1b090 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72  Shared that pBtr
1b0a0 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ee.** references
1b0b0 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1b0c0 72 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c  rsor is tripped,
1b0d0 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f   including curso
1b0e0 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a  rs that belong.*
1b0f0 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62  * to other datab
1b100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1b110 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62  that happen to b
1b120 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65  e sharing.** the
1b130 20 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72   cache with pBtr
1b140 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ee..**.** This r
1b150 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c  outine gets call
1b160 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ed when a rollba
1b170 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c  ck occurs..** Al
1b180 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20  l cursors using 
1b190 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d  the same cache m
1b1a0 75 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a  ust be tripped.*
1b1b0 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65  * to prevent the
1b1c0 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  m from trying to
1b1d0 20 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61   use the btree a
1b1e0 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  fter.** the roll
1b1f0 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62  back.  The rollb
1b200 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c  ack may have del
1b210 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f  eted tables.** o
1b220 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67  r moved root pag
1b230 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74  es, so it is not
1b240 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a   sufficient to.*
1b250 2a 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65  * save the state
1b260 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
1b270 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
1b280 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1b290 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
1b2a0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1b2b0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
1b2c0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
1b2d0 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  e){.  BtCursor *
1b2e0 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 3d  p;.  if( pBtree=
1b2f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b300 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b310 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
1b320 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
1b330 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1b340 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1b350 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
1b360 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1b370 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
1b380 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
1b390 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74  .    p->skipNext
1b3a0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
1b3b0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
1b3c0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1b3d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d    releasePage(p-
1b3e0 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1b3f0 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
1b400 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1b410 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b420 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f  ve(pBtree);.}../
1b430 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68  *.** Rollback th
1b440 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
1b450 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c 6c 20   progress.  All 
1b460 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 0a  cursors will be.
1b470 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62 79 20  ** invalided by 
1b480 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20  this operation. 
1b490 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
1b4a0 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20  use a cursor.** 
1b4b0 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74  that was open at
1b4c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1b4d0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
1b4e0 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a 2a 20   will result.** 
1b4f0 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
1b500 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1b510 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1b520 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1b530 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1b540 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1b550 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1b560 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1b570 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1b580 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b590 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
1b5a0 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
1b5b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1b5c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b5d0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
1b5e0 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c   *pPage1;..  sql
1b5f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b600 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
1b610 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
1b620 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
1b630 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
1b640 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1b650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1b660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1b670 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
1b680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
1b690 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1b6a0 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20  (p, tripCode);. 
1b6b0 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
1b6c0 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
1b6d0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1b6e0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
1b6f0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
1b700 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
1b710 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
1b720 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
1b730 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1b740 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
1b750 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
1b760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b770 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
1b780 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1b790 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
1b7a0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
1b7b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
1b7c0 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
1b7d0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
1b7e0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
1b7f0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
1b800 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
1b810 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
1b820 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
1b830 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
1b840 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
1b850 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
1b860 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
1b870 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
1b880 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
1b890 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
1b8a0 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
1b8b0 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
1b8c0 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
1b8d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1b8e0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
1b8f0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b900 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
1b910 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
1b920 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
1b930 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1b940 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
1b950 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
1b960 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
1b970 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
1b980 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b990 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1b9a0 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1b9b0 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1b9c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b9d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b9e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
1b9f0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
1ba00 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
1ba10 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
1ba20 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
1ba30 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1ba40 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1ba50 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1ba60 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1ba70 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1ba80 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1ba90 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1baa0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1bab0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1bac0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1bad0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1bae0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1baf0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1bb00 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1bb10 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1bb20 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1bb30 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1bb40 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1bb50 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1bb60 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1bb70 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1bb80 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1bb90 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1bba0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1bbb0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1bbc0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1bbd0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1bbe0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1bbf0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1bc00 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1bc10 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1bc20 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1bc30 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1bc40 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1bc50 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1bc60 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1bc70 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1bc80 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1bc90 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1bca0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1bcb0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1bcc0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1bcd0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1bce0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1bcf0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1bd00 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1bd10 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1bd20 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1bd30 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1bd40 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1bd50 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1bd60 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1bd70 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1bd80 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1bd90 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1bda0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1bdb0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1bdc0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1bdd0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1bde0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1bdf0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1be00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1be10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1be20 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1be30 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1be40 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1be50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1be60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1be70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1be80 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1be90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1bea0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1beb0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1bec0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1bed0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1bee0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1bef0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1bf00 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1bf10 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1bf20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1bf30 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1bf40 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1bf50 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1bf60 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1bf70 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1bf80 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1bf90 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1bfa0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1bfb0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1bfc0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1bfd0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1bfe0 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1bff0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1c000 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1c010 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1c020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c030 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1c040 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1c050 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1c060 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c070 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c080 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1c090 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1c0a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1c0b0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1c0c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1c0d0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1c0e0 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1c0f0 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1c100 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1c110 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1c120 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1c130 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1c140 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1c150 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1c160 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1c170 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1c180 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1c190 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1c1a0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1c1b0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1c1c0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1c1d0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1c1e0 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1c1f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1c200 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1c210 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1c220 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1c230 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1c240 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1c250 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1c260 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1c270 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1c280 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1c290 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1c2a0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1c2b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c2c0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1c2d0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1c2e0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1c2f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c300 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1c310 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1c320 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1c330 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c340 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1c350 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1c360 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1c370 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1c380 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1c390 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1c3a0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1c3b0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1c3c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1c3d0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1c3e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1c3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c400 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1c410 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1c420 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1c430 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c440 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1c450 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1c460 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c470 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1c480 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1c490 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1c4a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c4b0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1c4c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1c4d0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1c4e0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1c4f0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1c500 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1c510 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1c520 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1c530 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1c540 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1c550 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1c560 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1c570 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1c580 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1c590 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1c5a0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1c5b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1c5c0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1c5d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1c5e0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1c5f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c600 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1c610 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1c620 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1c630 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1c640 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1c650 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1c660 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1c670 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1c680 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1c690 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1c6a0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1c6b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1c6c0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1c6d0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1c6e0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1c6f0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1c700 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1c710 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1c720 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1c730 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1c740 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1c750 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1c760 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1c770 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1c780 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1c790 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1c7a0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1c7b0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1c7c0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1c7d0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1c7e0 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1c7f0 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1c800 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1c810 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1c820 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1c830 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1c840 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1c850 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1c860 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1c870 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1c880 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1c890 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1c8a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1c8b0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1c8c0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1c8d0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1c8e0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1c8f0 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1c900 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1c910 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1c920 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1c930 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1c940 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1c950 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1c960 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1c970 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1c980 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1c990 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1c9a0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1c9b0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1c9c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1c9d0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1c9e0 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1c9f0 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1ca00 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1ca10 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1ca20 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1ca30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1ca40 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1ca50 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1ca60 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1ca70 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1ca80 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1ca90 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1caa0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1cab0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1cac0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1cad0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1cae0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1caf0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1cb00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1cb10 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1cb20 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1cb30 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1cb40 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1cb50 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1cb60 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1cb70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cb80 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1cb90 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1cbc0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1cbd0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cbf0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1cc00 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1cc10 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1cc40 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1cc50 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1cc60 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1cc70 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1cc80 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1cc90 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1cca0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1ccb0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1cce0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1ccf0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1cd00 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1cd10 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1cd20 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1cd30 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1cd40 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1cd50 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1cd60 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1cd70 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1cd80 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1cd90 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1cda0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1cdb0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1cdc0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1cdd0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1cde0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1cdf0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1ce00 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1ce10 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1ce20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1ce30 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1ce40 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1ce50 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1ce60 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1ce70 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1ce80 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1ce90 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1cea0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1ceb0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1cec0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1ced0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1cee0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1cef0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1cf00 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1cf10 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1cf20 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1cf30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1cf40 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1cf50 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1cf60 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1cf70 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1cf80 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1cf90 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1cfa0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1cfb0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1cfc0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1cfd0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1cfe0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1cff0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1d000 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1d010 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1d020 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1d030 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1d040 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
1d050 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
1d060 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
1d070 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1d080 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1d090 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1d0a0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1d0b0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1d0c0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1d0d0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1d0e0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1d0f0 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1d100 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1d110 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1d120 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1d130 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1d140 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1d150 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1d160 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1d170 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1d180 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1d190 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1d1a0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1d1b0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1d1c0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1d1d0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1d1e0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1d1f0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1d200 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1d210 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1d220 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1d230 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1d240 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1d250 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1d260 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d290 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1d2a0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d2d0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1d2e0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1d2f0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d320 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1d330 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1d340 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1d350 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1d360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d370 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1d380 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1d390 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1d3c0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1d3d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1d3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1d3f0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1d400 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1d410 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1d420 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1d430 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d440 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1d450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1d460 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1d470 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1d480 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1d490 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1d4a0 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1d4b0 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1d4c0 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1d4d0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1d4e0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1d4f0 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1d500 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1d510 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1d520 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1d530 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1d540 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1d550 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1d560 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1d570 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1d580 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1d590 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1d5a0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1d5b0 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1d5c0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1d5d0 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1d5e0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1d5f0 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1d600 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1d610 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1d620 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1d630 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1d640 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1d650 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1d660 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1d670 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1d680 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1d690 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1d6a0 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1d6b0 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1d6c0 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1d6d0 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1d6e0 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1d6f0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1d700 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1d710 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1d720 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1d730 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1d740 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1d750 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1d760 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1d770 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1d780 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1d790 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1d7a0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1d7b0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1d7c0 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1d7d0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d7e0 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1d7f0 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1d800 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1d810 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1d820 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1d830 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1d840 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1d850 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1d860 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1d870 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1d880 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1d890 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1d8a0 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1d8b0 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1d8c0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1d8d0 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1d8e0 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1d8f0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d900 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1d910 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1d920 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1d930 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1d940 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1d950 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1d960 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1d970 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d980 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1d990 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1d9a0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1d9b0 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1d9c0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1d9d0 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1d9e0 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1d9f0 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1da00 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1da10 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1da20 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1da30 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1da40 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1da50 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1da60 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1da70 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1da80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1da90 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1daa0 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1dab0 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1dac0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1dad0 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1dae0 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1daf0 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1db00 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1db10 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1db20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1db30 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1db40 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1db50 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1db60 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1db70 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1db80 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1db90 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1dba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1dbb0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1dbc0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1dbd0 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1dbe0 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1dbf0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1dc00 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1dc10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1dc20 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1dc30 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1dc40 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1dc50 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1dc60 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1dc70 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1dc80 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1dc90 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1dca0 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1dcb0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1dcc0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1dcd0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1dce0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1dcf0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1dd00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1dd10 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1dd20 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1dd30 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1dd40 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1dd50 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1dd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dd70 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1dd80 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1dd90 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1dda0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1ddb0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1ddc0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1ddd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1dde0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1ddf0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1de00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1de10 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1de20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1de30 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1de40 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1de50 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1de60 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1de70 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1de80 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1de90 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1dea0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1deb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1dec0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1ded0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1dee0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1def0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1df00 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1df10 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1df20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1df30 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1df40 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1df50 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1df60 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1df70 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1df80 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1df90 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1dfa0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1dfb0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1dfc0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1dfd0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1dfe0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1dff0 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1e000 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1e010 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1e020 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1e030 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1e040 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1e050 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1e060 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1e070 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1e080 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1e090 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1e0a0 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1e0b0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1e0c0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1e0d0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1e0e0 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1e0f0 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1e100 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1e110 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1e120 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1e130 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1e140 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1e150 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1e160 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1e170 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1e180 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1e190 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1e1a0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1e1b0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1e1c0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1e1d0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1e1e0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1e1f0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1e200 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1e210 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1e220 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1e230 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1e240 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1e250 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1e260 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
1e270 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1e280 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1e290 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1e2a0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1e2b0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1e2c0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1e2d0 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1e2e0 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1e2f0 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1e300 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1e310 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1e320 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1e330 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1e340 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1e350 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1e360 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1e370 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1e380 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1e390 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1e3a0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1e3b0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1e3c0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1e3d0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1e3e0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1e3f0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1e400 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1e410 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1e420 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1e430 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1e440 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1e450 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1e460 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1e470 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1e480 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1e490 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1e4a0 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1e4e0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1e4f0 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e520 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1e530 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1e540 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e580 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1e590 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1e5a0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1e5b0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1e5c0 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1e5d0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1e620 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e660 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1e670 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1e680 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1e6c0 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1e6d0 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1e6e0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1e6f0 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1e700 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1e710 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1e720 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1e730 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1e740 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1e750 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1e760 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1e770 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1e780 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1e790 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1e7a0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1e7b0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1e7c0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1e7d0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1e7e0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e7f0 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1e800 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e810 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1e820 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1e830 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1e840 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e850 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1e860 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1e870 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1e880 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1e890 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1e8a0 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1e8b0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1e8c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1e8d0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1e8e0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1e8f0 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1e900 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1e910 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1e920 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1e930 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1e940 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1e950 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e960 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1e970 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1e980 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1e990 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1e9a0 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1e9b0 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1e9c0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1e9d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e9e0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1e9f0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1ea00 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1ea10 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1ea20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ea30 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1ea40 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1ea50 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1ea60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ea70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ea80 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ea90 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1eaa0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1eab0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1eac0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1ead0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1eae0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1eaf0 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1eb00 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1eb10 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1eb20 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1eb30 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1eb40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1eb50 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1eb60 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1eb70 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1eb80 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1eb90 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1eba0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1ebb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1ebc0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1ebd0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1ebe0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1ebf0 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1ec00 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1ec10 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1ec20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1ec30 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1ec40 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1ec50 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1ec60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ec70 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1ec80 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1ec90 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1eca0 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1ecb0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1ecc0 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1ecd0 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1ece0 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1ecf0 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1ed00 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1ed10 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1ed20 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1ed30 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1ed40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ed50 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1ed60 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1ed70 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1ed80 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ed90 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1eda0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1edb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1edc0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1edd0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1ede0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1edf0 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1ee00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ee10 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1ee20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1ee30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1ee40 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1ee50 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1ee60 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1ee70 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1ee80 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1ee90 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1eea0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1eeb0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1eec0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1eed0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1eee0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1eef0 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1ef00 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1ef10 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1ef20 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1ef30 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1ef40 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1ef50 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1ef60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1ef70 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1ef80 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1ef90 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1efa0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1efb0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1efc0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1efd0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1efe0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1eff0 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1f000 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1f010 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1f020 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1f030 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1f040 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1f050 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1f060 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1f070 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1f080 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1f090 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1f0a0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1f0b0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1f0c0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1f0d0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1f0e0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1f0f0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1f100 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1f110 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1f120 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1f130 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1f140 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1f150 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1f160 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1f170 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1f180 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1f190 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1f1a0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1f1b0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1f1c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1f1d0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1f1e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f200 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1f210 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1f220 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1f230 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1f240 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1f250 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1f260 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1f270 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1f280 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1f290 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1f2a0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1f2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f2c0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1f2d0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1f2e0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1f2f0 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1f300 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1f310 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f320 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1f330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1f340 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1f350 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1f360 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1f370 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1f380 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1f390 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1f3a0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1f3b0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1f3c0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1f3d0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1f3e0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1f3f0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1f400 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1f410 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1f420 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1f430 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1f440 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1f450 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1f460 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1f470 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1f480 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1f490 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1f4a0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1f4b0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1f4c0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f4d0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1f4e0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1f4f0 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1f500 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1f510 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1f520 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1f530 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1f540 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f550 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f560 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1f570 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1f580 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1f590 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1f5a0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1f5b0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1f5c0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1f5d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f5e0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1f5f0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1f600 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1f610 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1f620 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1f630 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f640 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f650 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1f660 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1f670 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1f680 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1f6a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1f6b0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1f6c0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1f6d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1f6e0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1f6f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1f710 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1f720 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1f730 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1f740 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1f750 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1f760 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1f770 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1f780 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1f790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1f7a0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1f7b0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1f7c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1f7d0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1f7e0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1f7f0 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1f800 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1f810 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1f820 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1f830 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1f840 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1f850 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1f860 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1f870 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1f880 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1f890 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1f8a0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1f8b0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1f8c0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1f8d0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1f8e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1f8f0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1f900 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1f910 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1f920 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1f930 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1f940 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1f950 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f960 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1f970 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1f980 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1f990 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1f9a0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1f9b0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1f9c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f9d0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1f9e0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1fa00 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1fa10 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1fa40 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1fa50 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1fa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1fa70 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1fa80 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1fa90 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1faa0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1fab0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1fac0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1fad0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1fae0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1faf0 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1fb00 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1fb10 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1fb20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1fb30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
1fb40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fb50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fb60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1fb70 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1fb80 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
1fb90 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
1fba0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
1fbb0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
1fbc0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
1fbd0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1fbe0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
1fbf0 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
1fc00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1fc10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1fc20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1fc30 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1fc40 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
1fc50 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1fc60 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
1fc70 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
1fc80 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1fc90 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
1fca0 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
1fcb0 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
1fcc0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
1fcd0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
1fce0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1fcf0 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
1fd00 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
1fd10 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
1fd20 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
1fd30 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1fd40 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
1fd50 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1fd60 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
1fd70 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
1fd80 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
1fd90 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1fda0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
1fdb0 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
1fdc0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
1fdd0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1fde0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
1fdf0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1fe00 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1fe10 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
1fe20 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
1fe30 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
1fe40 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
1fe50 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
1fe60 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
1fe70 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
1fe80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1fe90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1fea0 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
1feb0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
1fec0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
1fed0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1fee0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
1fef0 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
1ff00 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
1ff10 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
1ff20 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
1ff30 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
1ff40 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
1ff50 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
1ff60 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
1ff70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1ff80 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1ff90 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1ffa0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
1ffb0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
1ffc0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
1ffd0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
1ffe0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
1fff0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
20000 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
20010 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
20020 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
20030 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
20040 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
20050 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
20060 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
20070 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
20080 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
20090 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
200a0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
200b0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
200c0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
200d0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
200e0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
200f0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
20100 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
20110 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
20120 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
20130 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
20140 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
20150 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
20160 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
20170 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
20180 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
20190 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
201a0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
201b0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
201c0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
201d0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
201e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
201f0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
20200 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
20210 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
20220 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
20230 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
20240 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
20250 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
20260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
20270 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
20280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
20290 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
202a0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
202b0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
202c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
202d0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
202e0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
202f0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
20300 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20310 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
20320 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
20330 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
20340 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
20350 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
20360 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20370 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20380 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20390 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
203a0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
203b0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
203c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
203d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
203e0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
203f0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
20400 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
20410 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
20420 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
20430 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
20440 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
20450 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
20460 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
20470 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
20480 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
20490 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
204a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
204b0 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
204c0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
204d0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
204e0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
204f0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
20500 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
20510 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
20520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20530 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20540 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
20550 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
20560 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
20570 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
20580 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
20590 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
205a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
205b0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
205c0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
205d0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
205e0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
205f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20600 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
20610 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
20620 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
20630 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
20640 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
20650 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
20660 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
20670 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
20680 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
20690 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
206a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
206b0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
206c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
206d0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
206e0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
206f0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
20700 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
20710 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
20720 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
20730 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
20740 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
20750 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
20760 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
20770 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20780 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20790 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
207a0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
207b0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
207c0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
207d0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
207e0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
207f0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
20800 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
20810 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
20820 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
20830 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
20840 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
20850 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
20860 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
20870 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
20880 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
20890 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
208a0 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
208b0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
208c0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
208d0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
208e0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
208f0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
20900 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
20910 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
20920 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
20930 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
20940 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
20950 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
20960 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
20970 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
20980 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
20990 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
209a0 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
209b0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
209c0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
209d0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
209e0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
209f0 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
20a00 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
20a10 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
20a20 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
20a30 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
20a40 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
20a50 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
20a60 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
20a70 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
20a80 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
20a90 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
20aa0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
20ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20ac0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
20ad0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
20ae0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
20af0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
20b00 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
20b10 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
20b20 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
20b30 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
20b40 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
20b50 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
20b60 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
20b70 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
20b80 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
20b90 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
20ba0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
20bb0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
20bc0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
20bd0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
20be0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
20bf0 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
20c00 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
20c10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
20c20 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
20c30 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
20c40 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
20c50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20c60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20c70 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
20c80 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
20c90 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
20ca0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
20cb0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
20cc0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
20cd0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
20ce0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20cf0 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
20d00 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
20d10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
20d20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20d30 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
20d40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20d50 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
20d60 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
20d70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
20d80 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
20d90 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
20da0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
20db0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
20dc0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
20dd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
20de0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
20df0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20e00 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
20e10 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
20e20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
20e30 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
20e40 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
20e50 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
20e60 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
20e70 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
20e80 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
20e90 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
20ea0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
20eb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
20ec0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
20ed0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20ee0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
20ef0 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
20f00 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20f10 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20f20 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
20f30 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
20f40 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
20f50 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
20f60 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
20f70 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
20f80 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
20f90 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
20fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20fb0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
20fc0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
20fd0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
20fe0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
20ff0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
21000 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
21010 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
21020 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
21030 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
21040 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
21050 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
21060 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
21070 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
21080 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
21090 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
210a0 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
210b0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
210c0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
210d0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
210e0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
210f0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
21100 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
21110 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
21120 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
21130 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
21140 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
21150 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
21160 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
21170 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
21180 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
21190 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
211a0 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
211b0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
211c0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
211d0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
211e0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
211f0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
21200 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
21210 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
21220 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
21230 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
21240 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
21250 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
21260 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
21270 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20 62   then data can b
21280 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 20  e read directly 
21290 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
212a0 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65 0a  e file into the.
212b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
212c0 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73 73  t buffer, bypass
212d0 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61 63  ing the page-cac
212e0 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 54  he altogether. T
212f0 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20 20  his speeds.     
21300 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e 67     ** up loading
21310 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20 74   large records t
21320 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f 76  hat span many ov
21330 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
21340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21350 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20 20   if( eOp==0     
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20 2a          /* (1) *
21390 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f 66  /.         && of
213a0 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20 20  fset==0         
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20   /* (2) */.     
213e0 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
213f0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
21400 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
21410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
21420 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
21430 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
21440 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
21450 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
21460 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
21470 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
21480 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
21490 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
214a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
214b0 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  5) */.        ){
214c0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
214d0 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
214e0 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
214f0 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
21500 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
21510 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
21520 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21530 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
21540 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
21550 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
21560 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
21570 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
21580 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
21590 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
215a0 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
215b0 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
215c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
215d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
215e0 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
215f0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
21600 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
21610 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
21620 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
21630 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
21640 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21660 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
21670 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
21680 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21690 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
216a0 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
216b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
216c0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
216d0 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
216e0 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
216f0 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
21700 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21710 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
21720 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
21730 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
21740 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21750 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
21760 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
21770 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
21780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
21790 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
217a0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
217b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
217c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
217d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
217e0 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
217f0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
21800 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
21810 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
21820 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
21830 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
21840 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
21850 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
21860 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
21870 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
21880 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
21890 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
218a0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
218b0 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
218c0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
218d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
218e0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
218f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
21900 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21910 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21920 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
21930 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
21940 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
21950 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
21960 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
21970 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
21980 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21990 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
219a0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
219b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
219c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
219d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
219e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
219f0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
21a00 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
21a10 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
21a20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
21a30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21a40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21a50 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
21a60 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21a70 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
21a80 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
21a90 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
21aa0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
21ab0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
21ac0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
21ad0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
21ae0 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
21af0 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
21b00 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
21b10 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
21b20 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
21b30 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
21b40 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
21b50 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
21b60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21b70 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
21b80 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
21b90 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
21ba0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
21bb0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
21bc0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
21bd0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
21be0 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
21bf0 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
21c00 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
21c10 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
21c20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
21c30 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
21c40 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
21c50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
21c60 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
21c70 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21c80 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
21c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
21ca0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
21cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
21cc0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21cd0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
21ce0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
21cf0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
21d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21d10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
21d20 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21d30 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
21d40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
21d50 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
21d60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21d70 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
21d80 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21d90 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
21da0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21db0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
21dc0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
21dd0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
21de0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
21df0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21e00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
21e10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
21e20 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
21e30 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
21e40 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
21e50 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
21e60 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
21e70 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
21e80 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
21e90 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73  .** the key if s
21ea0 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74  kipKey==0 and it
21eb0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
21ec0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61  eginning of data
21ed0 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d   if.** skipKey==
21ee0 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1.  The number o
21ef0 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c  f bytes of avail
21f00 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73  able key/data is
21f10 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
21f20 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d   *pAmt.  If *pAm
21f30 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76  t==0, then the v
21f40 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69  alue returned wi
21f50 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76  ll not be.** a v
21f60 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  alid pointer..**
21f70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21f80 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
21f90 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d  ion.  It is comm
21fa0 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  on for the entir
21fb0 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74  e key.** and dat
21fc0 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  a to fit on the 
21fd0 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66  local page and f
21fe0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e  or there to be n
21ff0 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61  o overflow.** pa
22000 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20  ges.  When that 
22010 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74  is so, this rout
22020 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ine can be used 
22030 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a  to access the.**
22040 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69   key and data wi
22050 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63  thout making a c
22060 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79  opy.  If the key
22070 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69   and/or data spi
22080 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72  lls.** onto over
22090 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e  flow pages, then
220a0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
220b0 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f   must be used to
220c0 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74   reassemble.** t
220d0 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20  he key/data and 
220e0 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70  copy it into a p
220f0 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  reallocated buff
22100 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  er..**.** The po
22110 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62  inter returned b
22120 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c  y this routine l
22130 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e  ooks directly in
22140 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a  to the cached.**
22150 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
22160 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61  abase.  The data
22170 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72   might change or
22180 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74   move the next t
22190 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65  ime.** any btree
221a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
221b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ed..*/.static co
221c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
221d0 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  r *fetchPayload(
221e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
221f0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
22200 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
22210 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
22220 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c   */.  int *pAmt,
22230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
22240 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
22250 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
22260 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  s here */.  int 
22270 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20  skipKey         
22280 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69   /* read beginni
22290 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68  ng at data if th
222a0 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b  is is true */.){
222b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
222c0 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65   *aPayload;.  Me
222d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
222e0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20  u32 nKey;.  u32 
222f0 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72  nLocal;..  asser
22300 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
22310 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
22320 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22330 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
22340 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
22350 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
22360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
22370 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22380 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20  Cur) );.  pPage 
22390 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
223a0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
223b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
223c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
223d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
223e0 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72    if( NEVER(pCur
223f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29  ->info.nSize==0)
22400 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72   ){.    btreePar
22410 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
22420 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
22430 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
22440 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22460 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
22470 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
22480 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a  ur->info.pCell;.
22490 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43    aPayload += pC
224a0 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72  ur->info.nHeader
224b0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
224c0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65  ntKey ){.    nKe
224d0 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
224e0 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74 29      nKey = (int)
224f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
22500 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b  .  }.  if( skipK
22510 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f  ey ){.    aPaylo
22520 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20  ad += nKey;.    
22530 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
22540 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65  nfo.nLocal - nKe
22550 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
22560 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69  nLocal = pCur->i
22570 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  nfo.nLocal;.    
22580 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d  assert( nLocal<=
22590 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a 70  nKey );.  }.  *p
225a0 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
225b0 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
225c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
225d0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
225e0 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
225f0 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
22600 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
22610 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
22620 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
22630 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
22640 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
22650 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
22660 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
22670 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
22680 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
22690 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
226a0 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
226b0 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
226c0 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
226d0 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
226e0 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
226f0 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
22700 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
22710 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
22720 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
22730 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
22740 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
22750 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
22760 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
22770 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
22780 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
22790 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
227a0 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
227b0 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
227c0 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
227d0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
227e0 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
227f0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
22800 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
22810 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
22820 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
22830 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
22840 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
22850 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
22860 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22870 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
22880 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
22890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
228a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
228b0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
228c0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
228d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
228e0 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
228f0 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
22900 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22910 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
22920 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n p;.}.const voi
22930 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
22940 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
22950 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
22960 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  mt){.  const voi
22970 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73 65  d *p = 0;.  asse
22980 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22990 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
229a0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
229b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
229c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
229d0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57  ur) );.  if( ALW
229e0 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74 65  AYS(pCur->eState
229f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  ==CURSOR_VALID) 
22a00 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e 73  ){.    p = (cons
22a10 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
22a20 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
22a30 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
22a40 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  n p;.}.../*.** M
22a50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
22a60 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
22a70 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
22a80 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
22a90 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
22aa0 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
22ab0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
22ac0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
22ad0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
22ae0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
22af0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
22b00 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
22b10 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
22b20 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
22b30 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
22b40 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
22b50 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
22b60 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
22b70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
22b80 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
22b90 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
22ba0 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
22bb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
22bc0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
22bd0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
22be0 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
22bf0 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72  ;.  int i = pCur
22c00 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61  ->iPage;.  MemPa
22c10 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20  ge *pNewPage;.  
22c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22c30 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
22c40 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22c50 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22c60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22c70 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22c80 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
22c90 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
22ca0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
22cb0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
22cc0 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52  iPage>=(BTCURSOR
22cd0 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b  _MAX_DEPTH-1) ){
22ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22cf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22d00 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41  .  }.  rc = getA
22d10 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
22d20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61  newPgno, &pNewPa
22d30 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
22d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75  return rc;.  pCu
22d50 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d  r->apPage[i+1] =
22d60 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75   pNewPage;.  pCu
22d70 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20  r->aiIdx[i+1] = 
22d80 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  0;.  pCur->iPage
22d90 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ++;..  pCur->inf
22da0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
22db0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
22dc0 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61   0;.  if( pNewPa
22dd0 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
22de0 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
22df0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
22e00 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
22e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22e20 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
22e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22e40 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  OK;.}..#if 0./*.
22e50 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
22e60 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
22e70 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
22e80 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
22e90 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
22ea0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
22eb0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
22ec0 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
22ed0 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
22ee0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
22ef0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
22f00 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
22f10 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
22f20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
22f30 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
22f40 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
22f50 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
22f60 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
22f70 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
22f80 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
22f90 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
22fa0 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
22fb0 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
22fc0 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
22fd0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
22fe0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
22ff0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
23000 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
23010 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
23020 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
23030 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
23040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
23050 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
23060 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
23070 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
23080 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
23090 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
230a0 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
230b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
230c0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
230d0 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
230e0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
230f0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
23100 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
23110 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
23120 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
23130 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
23140 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
23150 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
23160 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
23170 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
23180 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
23190 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
231a0 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
231b0 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
231c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
231d0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
231e0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
231f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23200 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23220 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23230 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23240 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
23250 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
23260 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23270 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20  r->iPage] );..  
23280 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73  /* UPDATE: It is
23290 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
232a0 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69  le for the condi
232b0 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74  tion tested by t
232c0 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62  he assert.  ** b
232d0 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75  elow to be untru
232e0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
232f0 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
23300 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  t. This can occu
23310 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75  r if.  ** one cu
23320 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65  rsor has modifie
23330 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77  d page pParent w
23340 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65  hile a reference
23350 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a   to it is held .
23360 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64    ** by a second
23370 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63   cursor. Which c
23380 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
23390 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
233a0 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69  is linked.  ** i
233b0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
233c0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
233d0 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  re in a corrupt 
233e0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69  database.  */.#i
233f0 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65  f 0.  assertPare
23400 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
23410 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23420 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
23430 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23440 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
23450 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23460 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
23470 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65    );.#endif.  te
23480 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
23490 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
234a0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
234b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
234c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
234d0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
234e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
234f0 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
23500 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
23510 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23520 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23530 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
23540 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
23550 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
23560 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
23570 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
23580 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
23590 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
235a0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
235b0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
235c0 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
235d0 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
235e0 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
235f0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
23600 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
23610 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
23620 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
23630 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
23640 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
23650 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
23660 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
23670 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
23680 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
23690 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
236a0 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
236b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
236c0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
236d0 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
236e0 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
236f0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
23700 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c  ALID. Otherwise,
23710 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73   the cursor is s
23720 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
23730 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c  he first.** cell
23740 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20   located on the 
23750 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c  root (or virtual
23760 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20   root) page and 
23770 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
23780 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55  .** is set to CU
23790 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
237a0 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
237b0 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  on returns succe
237c0 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20  ssfully, it may 
237d0 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  be assumed that 
237e0 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64  the.** page-head
237f0 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74  er flags indicat
23800 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74  e that the [virt
23810 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69  ual] root-page i
23820 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  s the expected .
23830 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65  ** kind of b-tre
23840 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20  e page (i.e. if 
23850 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65  when opening the
23860 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c   cursor the call
23870 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70  er did not.** sp
23880 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
23890 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
238a0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
238b0 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c  to 0x05 or 0x0D,
238c0 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61  .** indicating a
238d0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f   table b-tree, o
238e0 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20  r if the caller 
238f0 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65  did specify a Ke
23900 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74  yInfo .** struct
23910 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
23920 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
23930 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63  2 or 0x0A, indic
23940 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a  ating an index.*
23950 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74  * b-tree)..*/.st
23960 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
23970 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
23980 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
23990 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
239a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
239b0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
239c0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
239d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
239e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
239f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
23a00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23a10 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
23a20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
23a30 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
23a40 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
23a50 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
23a60 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
23a70 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
23a80 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
23a90 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
23aa0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
23ab0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
23ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
23ad0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23ae0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
23af0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
23b00 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f  ipNext!=SQLITE_O
23b10 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K );.      retur
23b20 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
23b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23b40 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
23b50 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a  sor(pCur);.  }..
23b60 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23b70 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  e>=0 ){.    int 
23b80 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  i;.    for(i=1; 
23b90 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
23ba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
23bb0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
23bc0 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
23bd0 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20      pCur->iPage 
23be0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
23bf0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
23c00 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
23c10 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
23c20 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
23c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
23c50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
23c60 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
23c70 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  oot, &pCur->apPa
23c80 67 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  ge[0]);.    if( 
23c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23ca0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
23cb0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
23cc0 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75  ALID;.      retu
23cd0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23ce0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
23cf0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75  ;..    /* If pCu
23d00 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e  r->pKeyInfo is n
23d10 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  ot NULL, then th
23d20 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70  e caller that op
23d30 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72  ened this cursor
23d40 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64  .    ** expected
23d50 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
23d60 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
23d70 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
23d80 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a  eyInfo is.    **
23d90 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
23da0 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
23db0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
23dc0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
23dd0 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  e,.    ** return
23de0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   an SQLITE_CORRU
23df0 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  PT error.  */.  
23e00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23e10 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
23e20 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70  y==1 || pCur->ap
23e30 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
23e40 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  =0 );.    if( (p
23e50 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
23e60 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  )!=pCur->apPage[
23e70 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  0]->intKey ){.  
23e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23e90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
23ea0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
23eb0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23ec0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20  root page is of 
23ed0 74 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65  the correct type
23ee0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74  . This must be t
23ef0 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20  he.  ** case as 
23f00 74 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  the call to this
23f10 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c   function that l
23f20 6f 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70  oaded the root-p
23f30 61 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a  age (either.  **
23f40 20 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20   this call or a 
23f50 70 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74  previous invocat
23f60 69 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20  ion) would have 
23f70 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
23f80 69 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  ion .  ** if the
23f90 20 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65   assumption were
23fa0 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69   not true, and i
23fb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
23fc0 65 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20  e for the flags 
23fd0 0a 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61  .  ** byte to ha
23fe0 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
23ff0 20 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73   while this curs
24000 6f 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  or is holding a 
24010 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74  reference.  ** t
24020 6f 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a  o the page.  */.
24030 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
24040 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73  apPage[0];.  ass
24050 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  ert( pRoot->pgno
24060 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
24070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
24080 6f 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28  oot->isInit && (
24090 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
240a0 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)==pRoot->intKe
240b0 79 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69  y );..  pCur->ai
240c0 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43  Idx[0] = 0;.  pC
240d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
240e0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
240f0 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
24100 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
24110 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
24120 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d  ll==0 && !pRoot-
24130 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
24140 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
24150 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
24160 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
24170 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
24180 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
24190 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
241a0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
241b0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
241c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
241d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
241e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
241f0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
24200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
24210 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
24220 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Root->nCell>0)?C
24230 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
24240 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d  OR_INVALID);.  }
24250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24260 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
24270 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
24280 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
24290 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
242a0 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20  the.** entry to 
242b0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
242c0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a  ently pointing..
242d0 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  **.** The left-m
242e0 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20  ost leaf is the 
242f0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61  one with the sma
24300 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20  llest key - the 
24310 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65  first.** in asce
24320 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
24330 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24340 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73  oLeftmost(BtCurs
24350 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
24360 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
24370 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24380 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
24390 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
243a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
243b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
243c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
243d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
243e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
243f0 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
24400 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24410 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
24420 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
24430 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24440 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
24450 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
24460 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
24470 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
24480 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24490 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63  iPage]));.    rc
244a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
244b0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
244c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
244d0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
244e0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
244f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
24500 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
24510 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
24520 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
24530 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
24540 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
24550 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
24560 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
24570 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
24580 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
24590 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
245a0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
245b0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
245c0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
245d0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
245e0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
245f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
24600 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
24610 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
24620 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
24630 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
24640 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
24650 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
24660 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
24670 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
24680 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
24690 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
246a0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
246b0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
246c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
246d0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
246e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
246f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
24700 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
24710 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24720 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24730 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
24740 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
24750 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
24760 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
24770 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
24780 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
24790 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
247a0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
247b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
247c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
247d0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
247e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
247f0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
24800 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
24810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72  E_OK ){.    pCur
24820 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24830 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
24840 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d  ell-1;.    pCur-
24850 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
24860 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
24870 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NKey = 0;.  }.  
24880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24890 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
248a0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
248b0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
248c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
248d0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
248e0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
248f0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
24900 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
24910 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
24920 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
24930 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
24940 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
24950 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
24960 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
24970 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
24980 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24990 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
249a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
249b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
249c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
249d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
249e0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
249f0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
24a00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
24a20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24a30 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
24a40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24a50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
24a60 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
24a70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24a80 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
24a90 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
24aa0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24ab0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24ac0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
24ad0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
24ae0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
24af0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
24b00 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
24b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
24b20 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
24b30 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
24b40 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
24b50 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
24b60 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
24b70 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
24b80 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
24b90 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
24ba0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
24bb0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
24bc0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
24bd0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
24be0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24bf0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
24c00 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
24c10 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
24c20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24c30 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24c60 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24c70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
24c80 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
24c90 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
24ca0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
24cb0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
24cc0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
24cd0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
24ce0 3e 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d  >eState && pCur-
24cf0 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65  >atLast ){.#ifde
24d00 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24d10 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
24d20 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
24d30 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
24d40 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
24d50 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
24d60 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
24d70 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
24d80 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
24d90 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
24da0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
24db0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
24dc0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
24dd0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
24de0 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
24df0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
24e00 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24e10 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
24e20 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24e30 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
24e40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24e50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24e60 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
24e70 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
24e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
24e90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
24ea0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
24eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24ec0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
24ed0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
24ee0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
24ef0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
24f00 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
24f10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24f20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
24f30 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
24f40 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
24f50 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24f60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24f70 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
24f80 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
24f90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
24fa0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
24fb0 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
24fc0 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
24fd0 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
24fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24ff0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
25000 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
25010 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
25020 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
25030 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
25040 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
25050 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
25060 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
25070 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
25080 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
25090 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
250a0 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
250b0 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
250c0 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
250d0 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
250e0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
250f0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
25100 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
25110 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
25120 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
25130 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
25140 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
25150 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
25160 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
25170 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
25180 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
25190 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
251a0 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
251b0 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
251c0 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
251d0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
251e0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
251f0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
25200 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
25210 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
25220 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
25230 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
25240 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
25250 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
25260 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
25270 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
25280 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
25290 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
252a0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
252b0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
252c0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
252d0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
252e0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
252f0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
25300 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
25310 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
25320 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
25330 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
25340 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
25350 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
25360 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
25370 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
25380 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
25390 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
253a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
253b0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
253d0 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
253e0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
253f0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
25400 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
25410 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
25420 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
25430 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
25440 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
25450 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
25460 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
25470 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
25480 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
25490 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
254a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
254b0 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
254c0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
254d0 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
254e0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
254f0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
25500 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
25510 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
25520 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
25530 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
25540 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
25550 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
25560 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
25570 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
25580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
25590 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
255a0 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
255b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
255c0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
255d0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
255e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
255f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
25600 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
25610 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
25620 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
25630 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
25640 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
25650 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
25660 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
25670 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
25680 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
25690 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
256a0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
256b0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
256c0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
256d0 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
256e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
256f0 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
25700 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
25710 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
25720 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
25730 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
25740 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
25750 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
25760 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
25770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
25780 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
25790 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
257a0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
257b0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
257c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
257d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
257e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
257f0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
25800 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
25810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25820 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
25830 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25840 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25850 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25860 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
25870 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25880 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25890 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
258a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
258b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
258c0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
258d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
258e0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
258f0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
25900 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
25910 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
25920 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
25930 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25940 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25950 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25960 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
25970 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25980 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
25990 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
259a0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70  [0]->intKey || p
259b0 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
259c0 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
259d0 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20  , upr, idx;.    
259e0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
259f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
25a00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
25a10 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
25a20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20   int c;..    /* 
25a30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73  pPage->nCell mus
25a40 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
25a50 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20  n zero. If this 
25a60 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  is the root-page
25a70 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73  .    ** the curs
25a80 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65  or would have be
25a90 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65  en INVALID above
25aa0 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b   and this for(;;
25ab0 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f  ) loop.    ** no
25ac0 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69  t run. If this i
25ad0 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70  s not the root-p
25ae0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f  age, then the mo
25af0 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74  veToChild() rout
25b00 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64  ine.    ** would
25b10 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65   have already de
25b20 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70  tected db corrup
25b30 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c  tion. Similarly,
25b40 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20   pPage must.    
25b50 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20  ** be the right 
25b60 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74  kind (index or t
25b70 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20  able) of b-tree 
25b80 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  page. Otherwise.
25b90 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43      ** a moveToC
25ba0 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f  hild() or moveTo
25bb0 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c  Root() call woul
25bc0 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20  d have detected 
25bd0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
25be0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25bf0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
25c00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25c10 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65  >intKey==(pIdxKe
25c20 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72  y==0) );.    lwr
25c30 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
25c40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
25c50 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
25c60 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
25c70 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25c80 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
25c90 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  = upr);.    }els
25ca0 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e{.      pCur->a
25cb0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25cc0 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20  ] = (u16)(idx = 
25cd0 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20  (upr+lwr)/2);.  
25ce0 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b    }.    for(;;){
25cf0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
25d00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
25d20 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
25d30 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
25d40 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
25d50 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64   idx==pCur->aiId
25d60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  x[pCur->iPage] )
25d70 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
25d80 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
25d90 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
25da0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
25db0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
25dc0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  trSize;.      if
25dd0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
25de0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
25df0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
25e00 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
25e10 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
25e20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
25e30 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
25e40 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
25e50 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
25e60 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
25e70 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
25e80 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
25e90 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
25ea0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
25eb0 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a           c = 0;.
25ec0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
25ed0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
25ee0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
25ef0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
25f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25f10 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
25f20 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  >intKey );.     
25f30 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20       c = +1;.   
25f40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
25f50 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
25f60 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72   1;.        pCur
25f70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
25f80 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  ellKey;.      }e
25f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
25fa0 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70  The maximum supp
25fb0 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20  orted page-size 
25fc0 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20  is 65536 bytes. 
25fd0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  This means that.
25fe0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d          ** the m
25ff0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
26000 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74   record bytes st
26010 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78  ored on an index
26020 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20   B-Tree.        
26030 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20  ** page is less 
26040 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73  than 16384 bytes
26050 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72   and may be stor
26060 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20  ed as a 2-byte. 
26070 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74         ** varint
26080 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  . This informati
26090 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74  on is used to at
260a0 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70  tempt to avoid p
260b0 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20  arsing .        
260c0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  ** the entire ce
260d0 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66  ll by checking f
260e0 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65  or the cases whe
260f0 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  re the record is
26100 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f   .        ** sto
26110 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74  red entirely wit
26120 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70  hin the b-tree p
26130 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e  age by inspectin
26140 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20  g the first .   
26150 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20       ** 2 bytes 
26160 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20  of the cell..   
26170 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
26180 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c  int nCell = pCel
26190 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
261a0 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
261b0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 0a  max1bytePayload.
261c0 20 20 20 20 20 20 20 20 20 2f 2a 20 26 26 20 28           /* && (
261d0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29 3c 70 50 61  pCell+nCell)<pPa
261e0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a  ge->aDataEnd */.
261f0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
26200 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
26210 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
26220 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
26230 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
26240 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
26250 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
26260 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
26270 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
26280 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
26290 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
262a0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
262b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
262c0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
262d0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
262e0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
262f0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
26300 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
26310 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
26320 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
26330 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
26340 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
26350 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
26360 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
26370 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
26380 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
26390 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2f  ocal.          /
263a0 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c  * && (pCell+nCel
263b0 6c 2b 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61  l+2)<=pPage->aDa
263c0 74 61 45 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  taEnd */.       
263d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
263e0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
263f0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
26400 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
26410 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
26420 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
26430 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
26440 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
26450 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
26460 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
26470 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
26480 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
26490 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
264a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
264b0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
264c0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
264d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
264e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
264f0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
26500 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
26510 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
26520 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
26530 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
26540 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
26550 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
26560 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
26570 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
26580 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
26590 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
265a0 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
265b0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
265c0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
265d0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
265e0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
265f0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
26600 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
26610 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
26620 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
26630 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
26640 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
26650 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
26660 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
26670 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
26680 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
26690 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
266a0 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
266b0 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
266c0 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
266d0 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
266e0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
266f0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
26700 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
26710 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
26720 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
26730 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
26740 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26750 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65         rc = acce
26760 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
26770 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67  0, nCell, (unsig
26780 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b  ned char*)pCellK
26790 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ey, 0);.        
267a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
267b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
267c0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
267d0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
267e0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
267f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26800 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
26810 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
26820 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
26830 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
26840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26850 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
26860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26870 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
26880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26890 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
268a0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
268b0 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
268c0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
268d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
268e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
268f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26900 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26910 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
26920 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
26930 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
26940 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
26950 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
26960 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
26970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26980 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
26990 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
269a0 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
269b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
269c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
269d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
269e0 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c  = (u16)(idx = (l
269f0 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20  wr+upr)/2);.    
26a00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
26a10 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
26a20 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
26a30 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
26a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26a50 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
26a60 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
26a70 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
26a80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
26a90 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
26aa0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
26ab0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
26ac0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
26ad0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
26ae0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
26af0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
26b00 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
26b10 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
26b20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
26b30 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
26b40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
26b50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
26b60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26b70 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26b80 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
26b90 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = c;.      rc = 
26ba0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
26bb0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
26bc0 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ish;.    }.    p
26bd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26be0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c  >iPage] = (u16)l
26bf0 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  wr;.    pCur->in
26c00 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26c10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
26c20 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
26c30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
26c40 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
26c50 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76  f( rc ) goto mov
26c60 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a  eto_finish;.  }.
26c70 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20  moveto_finish:. 
26c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26c90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
26ca0 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
26cb0 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
26cc0 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
26cd0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
26ce0 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
26cf0 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
26d00 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
26d10 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
26d20 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
26d30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
26d40 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
26d50 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
26d60 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
26d70 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
26d80 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
26d90 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
26da0 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
26db0 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
26dc0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26dd0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
26de0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
26df0 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
26e00 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
26e10 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
26e20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
26e30 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
26e40 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
26e50 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
26e60 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
26e70 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
26e80 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
26e90 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
26ea0 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
26eb0 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
26ec0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
26ed0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
26ee0 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
26ef0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
26f00 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
26f10 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
26f20 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
26f30 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
26f40 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
26f50 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
26f60 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
26f70 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
26f80 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
26f90 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
26fa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26fb0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
26fc0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
26fd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
26fe0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
26ff0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
27000 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27010 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
27020 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
27030 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
27040 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
27060 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
27070 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
27080 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49  ;.  if( CURSOR_I
27090 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
270a0 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65  tate ){.    *pRe
270b0 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s = 1;.    retur
270c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
270d0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69  .  if( pCur->ski
270e0 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70  pNext>0 ){.    p
270f0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
27100 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
27110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
27120 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
27130 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
27140 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
27150 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27160 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
27170 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
27180 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
27190 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
271a0 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nit );..  /* If 
271b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
271c0 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
271d0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
271e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
271f0 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
27200 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
27210 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
27220 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
27230 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
27240 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
27250 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
27260 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
27270 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
27280 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
27290 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
272a0 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
272b0 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
272c0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
272d0 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
272e0 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
272f0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
27300 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
27310 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
27320 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
27330 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
27340 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
27350 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d   if( idx>=pPage-
27360 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66  >nCell ){.    if
27370 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
27380 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  {.      rc = mov
27390 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
273a0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
273b0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
273c0 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20  Offset+8]));.   
273d0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
273e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20  rn rc;.      rc 
273f0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
27400 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
27410 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
27420 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
27430 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66      do{.      if
27440 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
27450 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65   ){.        *pRe
27460 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  s = 1;.        p
27470 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
27480 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
27490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
274a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
274b0 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
274c0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
274d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
274e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
274f0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
27500 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27510 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
27520 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
27530 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
27540 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
27550 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
27560 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
27570 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
27580 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
27590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
275a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
275b0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
275c0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
275d0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
275e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
275f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
27600 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
27610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27620 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
27630 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
27640 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
27650 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
27660 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
27670 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
27680 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
27690 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
276a0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
276b0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
276c0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
276d0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
276e0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
276f0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
27700 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
27710 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
27720 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
27730 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
27740 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
27750 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
27760 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27770 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27780 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
27790 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
277a0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
277b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
277c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
277d0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
277e0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
277f0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
27800 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
27810 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
27820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27830 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
27840 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
27850 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
27860 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
27870 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
27880 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
27890 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
278a0 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  = 0;..  pPage = 
278b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
278c0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
278d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
278e0 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
278f0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27900 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
27910 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27920 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
27930 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
27940 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
27950 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
27960 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27970 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
27980 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
27990 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
279a0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
279b0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
279c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
279d0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
279e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
279f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
27a00 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
27a10 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
27a20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
27a30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27a40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
27a50 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
27a60 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
27a70 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
27a80 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
27a90 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
27aa0 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
27ab0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27ac0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
27ad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27ae0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
27af0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
27b00 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
27b10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27b20 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
27b30 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
27b40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27b50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
27b70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
27b80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
27b90 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
27ba0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
27bb0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
27bc0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
27bd0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
27be0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
27bf0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
27c00 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
27c10 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
27c20 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
27c30 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
27c40 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
27c50 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
27c60 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
27c70 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
27c80 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
27c90 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
27ca0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
27cb0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
27cc0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
27cd0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
27ce0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
27cf0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
27d00 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
27d10 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
27d20 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
27d30 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
27d40 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
27d50 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
27d60 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
27d70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
27d80 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
27d90 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
27da0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
27db0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
27dc0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
27dd0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
27de0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
27df0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
27e00 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
27e10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
27e20 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
27e30 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
27e40 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
27e50 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
27e60 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
27e70 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
27e80 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
27e90 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
27ea0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
27eb0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
27ec0 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
27ed0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
27ee0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
27ef0 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
27f00 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
27f10 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
27f20 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
27f30 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
27f40 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
27f50 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
27f60 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
27f70 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
27f80 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
27f90 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
27fa0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
27fb0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
27fc0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
27fd0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
27fe0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
27ff0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
28000 75 38 20 65 4d 6f 64 65 0a 29 7b 0a 20 20 4d 65  u8 eMode.){.  Me
28010 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
28020 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
28030 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
28040 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
28050 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
28060 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
28070 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
28080 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
28090 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
280a0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
280b0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
280c0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
280d0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
280e0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
280f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
28100 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
28110 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28120 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
28130 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
28140 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
28150 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
28160 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
28170 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
28180 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
28190 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
281a0 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
281b0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
281c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
281d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
281e0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
281f0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
28200 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
28210 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
28220 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
28230 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
28240 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
28250 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
28260 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
28270 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
28280 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
28290 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
282a0 66 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61  f the 'exact' pa
282b0 72 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65  rameter was true
282c0 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
282d0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
282e0 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
282f0 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
28300 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
28310 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
28320 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
28330 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
28340 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
28350 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
28360 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
28370 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
28380 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f  CUUM.    if( eMo
28390 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
283a0 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  T ){.      if( n
283b0 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
283c0 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
283d0 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
283e0 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
283f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28400 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
28410 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
28420 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
28430 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
28440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28460 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
28470 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
28480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65   ){.          se
28490 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
284a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
284b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
284c0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
284d0 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
284e0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ist = 1;.    }.#
284f0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
28500 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
28510 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
28520 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
28530 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
28540 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
28550 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
28560 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
28570 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
28580 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
28590 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
285a0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
285b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
285c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
285d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
285e0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
285f0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
28600 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
28610 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
28620 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
28630 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
28640 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
28650 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
28660 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
28670 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
28680 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
28690 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
286a0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
286b0 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20  ' is located..  
286c0 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20    */.    do {.  
286d0 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
286e0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69   pTrunk;.      i
286f0 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  f( pPrevTrunk ){
28700 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
28710 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65  = get4byte(&pPre
28720 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
28730 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28740 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
28750 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
28760 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
28770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73       }.      tes
28780 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d  tcase( iTrunk==m
28790 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69  xPage );.      i
287a0 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65  f( iTrunk>mxPage
287b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
287c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
287d0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
287e0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
287f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28800 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
28810 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  k, 0);.      }. 
28820 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28830 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
28840 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
28850 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
28860 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
28870 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21   assert( pTrunk!
28880 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
28890 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  rt( pTrunk->aDat
288a0 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b  a!=0 );..      k
288b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
288c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20  unk->aData[4]); 
288d0 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f  /* # of leaves o
288e0 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  n this trunk pag
288f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b  e */.      if( k
28900 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
28910 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
28920 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
28930 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
28940 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
28950 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
28960 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
28970 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
28980 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
28990 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
289a0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
289b0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
289c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
289d0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
289e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
289f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28a00 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
28a10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28a20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28a30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28a40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
28a50 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
28a60 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
28a70 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
28a80 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
28a90 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
28aa0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
28ab0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
28ac0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
28ad0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
28ae0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
28af0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
28b00 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
28b10 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
28b20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
28b30 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
28b40 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
28b50 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
28b60 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
28b70 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
28b80 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
28b90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28ba0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28bb0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28bc0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
28bd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
28be0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
28bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
28c00 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
28c10 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
28c20 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
28c30 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
28c40 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
28c50 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
28c60 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
28c70 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
28c80 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
28c90 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
28ca0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
28cb0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
28cc0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
28cd0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
28ce0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28cf0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
28d00 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
28d10 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
28d20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
28d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
28d40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28d50 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
28d60 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
28d70 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
28d80 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28d90 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28da0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
28db0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
28dc0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
28dd0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
28de0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
28df0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
28e00 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
28e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
28e20 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
28e30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28e40 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
28e50 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
28e60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28e70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28e80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
28e90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28ea0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
28eb0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
28ec0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
28ed0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
28ee0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
28ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
28f00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28f10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
28f20 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
28f30 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
28f40 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
28f50 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
28f60 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
28f70 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
28f80 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
28f90 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
28fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
28fb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
28fc0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
28fd0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
28fe0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
28ff0 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
29000 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
29010 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
29020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29030 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
29040 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
29050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
29060 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
29070 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
29080 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
29090 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
290a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
290b0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
290c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
290d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
290e0 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
290f0 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
29100 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29120 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
29130 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29140 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
29150 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29160 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29170 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
29180 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
29190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
291a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
291b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
291c0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
291d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
291e0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
291f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29200 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
29210 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
29220 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
29230 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
29240 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
29250 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
29260 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
29270 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
29280 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
29290 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
292a0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
292b0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
292c0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
292d0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
292e0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
292f0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
29300 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29310 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
29320 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
29330 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
29340 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
29350 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
29360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
29370 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29380 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29390 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
293a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
293b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
293c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
293d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
293e0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
293f0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
29400 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
29410 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
29420 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
29430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29440 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
29450 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
29460 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
29470 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
29480 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
29490 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
294a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
294b0 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
294c0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
294d0 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
294e0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
294f0 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
29500 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
29510 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
29520 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
29530 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
29540 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
29550 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
29560 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
29570 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
29580 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
29590 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
295a0 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
295b0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
295c0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
295d0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  y);.          fo
295e0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
295f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
29600 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
29610 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
29620 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
29630 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
29640 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
29650 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
29660 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
29670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
29680 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
29690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
296a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
296b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
296c0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
296d0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
296e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
296f0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
29700 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
29710 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
29720 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
29730 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
29740 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
29750 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29760 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
29770 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
29780 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
29790 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
297a0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
297b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
297c0 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
297d0 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
297e0 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
297f0 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
29800 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
29810 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
29820 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
29830 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
29840 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
29850 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
29860 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
29870 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
29880 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
29890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
298a0 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
298b0 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
298c0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
298d0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
298e0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
298f0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
29900 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29910 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
29920 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29930 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29940 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29950 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
29960 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
29970 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29980 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
29990 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
299a0 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
299b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
299c0 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
299d0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
299e0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
299f0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
29a00 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
29a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
29a20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29a30 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
29a40 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
29a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29a70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29a80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29a90 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
29aa0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29ad0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
29ae0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
29af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29b10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
29b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29b30 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
29b40 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
29b50 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
29b60 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
29b70 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
29b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29b90 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
29ba0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
29bb0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
29bc0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
29bd0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
29be0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
29bf0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29c00 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
29c10 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
29c20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29c30 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
29c40 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
29c50 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
29c60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
29c70 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
29c80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29c90 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29ca0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
29cb0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
29cc0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
29cd0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
29ce0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
29cf0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
29d00 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
29d10 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
29d20 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
29d30 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
29d40 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
29d50 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
29d60 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
29d70 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
29d80 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
29d90 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
29da0 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
29db0 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
29dc0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
29dd0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
29de0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29df0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
29e00 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
29e10 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
29e20 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
29e30 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
29e40 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
29e50 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
29e60 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
29e70 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
29e80 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
29e90 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
29ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29ec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29ed0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
29ee0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
29ef0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
29f00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
29f10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
29f20 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
29f30 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
29f40 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
29f50 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
29f60 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
29f70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
29f80 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
29f90 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
29fa0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
29fb0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
29fc0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
29fd0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
29fe0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
29ff0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2a000 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2a010 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2a020 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
2a030 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2a040 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2a050 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
2a060 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
2a070 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2a080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a090 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
2a0a0 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
2a0b0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2a0c0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
2a0d0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
2a0e0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
2a0f0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
2a100 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
2a110 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
2a120 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
2a130 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
2a140 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a150 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
2a160 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a170 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2a180 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
2a190 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
2a1a0 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
2a1b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
2a1c0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
2a1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2a1e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2a1f0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
2a200 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
2a210 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
2a220 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
2a230 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
2a240 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2a250 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
2a260 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
2a270 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2a280 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2a290 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2a2a0 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
2a2b0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2a2c0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
2a2d0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
2a2e0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
2a2f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2a300 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
2a310 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
2a320 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
2a330 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2a340 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2a350 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
2a360 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
2a370 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
2a380 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
2a390 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
2a3a0 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
2a3b0 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
2a3c0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
2a3d0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
2a3e0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
2a3f0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
2a400 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
2a410 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
2a420 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
2a430 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
2a440 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a450 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
2a460 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
2a470 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
2a480 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2a490 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2a4a0 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
2a4b0 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
2a4c0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
2a4d0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
2a4e0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a500 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
2a510 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
2a520 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2a550 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
2a560 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
2a570 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
2a580 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
2a590 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
2a5a0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
2a5b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
2a5c0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2a5d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2a5e0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
2a5f0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
2a600 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a620 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2a630 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2a640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a660 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2a670 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2a680 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2a690 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a6a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2a6b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2a6c0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2a6d0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2a6e0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2a6f0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2a700 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2a710 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2a720 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2a730 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2a740 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2a750 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2a760 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2a770 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2a780 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2a790 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2a7a0 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2a7b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a7c0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2a7d0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2a7e0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2a7f0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2a800 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2a810 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2a820 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a830 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2a840 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2a850 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2a860 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2a870 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2a880 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2a890 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2a8a0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2a8b0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2a8c0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2a8d0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2a8e0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2a8f0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2a900 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2a910 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2a920 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2a930 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2a940 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2a950 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2a960 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2a970 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2a980 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2a9a0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2a9b0 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2a9c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2a9d0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2a9e0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2a9f0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2aa00 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2aa10 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2aa20 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2aa30 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2aa40 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2aa50 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2aa60 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2aa70 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2aa80 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2aa90 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2aaa0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2aab0 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2aac0 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2aad0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2aae0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2aaf0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2ab00 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2ab10 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2ab20 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2ab30 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2ab40 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2ab50 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2ab60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2ab70 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2ab80 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2ab90 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2aba0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2abb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2abc0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2abd0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2abe0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2abf0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2ac00 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
2ac10 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
2ac20 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
2ac30 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
2ac40 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
2ac50 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
2ac60 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
2ac70 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
2ac80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac90 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2aca0 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
2acb0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
2acc0 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
2acd0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2ace0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2acf0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2ad00 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2ad10 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2ad20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ad30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2ad40 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2ad50 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2ad60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2ad70 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2ad80 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2ad90 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2ada0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2adb0 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2adc0 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2add0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2ade0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2adf0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2ae00 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2ae10 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2ae20 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2ae30 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2ae40 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2ae50 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2ae60 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2ae70 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2ae80 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2ae90 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2aea0 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2aeb0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2aec0 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2aed0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2aee0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2aef0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2af00 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2af10 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2af20 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2af30 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2af40 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2af50 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2af60 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2af70 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2af80 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2af90 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2afa0 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2afb0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2afc0 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2afd0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2afe0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2aff0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2b000 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2b010 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2b020 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2b030 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2b040 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2b050 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2b060 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2b070 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2b080 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2b090 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2b0a0 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2b0b0 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2b0c0 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2b0d0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2b0e0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2b0f0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2b100 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2b110 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2b120 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2b130 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2b140 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2b150 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2b160 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2b170 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2b180 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2b190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b1a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b1b0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2b1c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2b1d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b1e0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2b1f0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2b200 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2b210 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2b220 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2b230 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2b240 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2b250 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2b260 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2b270 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2b280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2b290 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2b2a0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2b2b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2b2c0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2b2d0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2b2e0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2b2f0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2b300 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2b310 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2b320 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2b330 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2b340 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2b350 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2b360 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2b370 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2b380 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2b390 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2b3a0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2b3b0 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2b3c0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2b3d0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2b3e0 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2b3f0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2b400 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2b410 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2b420 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2b430 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2b440 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2b450 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2b460 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2b470 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2b480 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2b490 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2b4a0 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2b4b0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2b4c0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2b4d0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2b4e0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2b4f0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2b500 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2b510 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2b520 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2b530 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2b540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b550 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2b560 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2b570 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2b580 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2b590 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2b5a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2b5b0 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2b5c0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2b5d0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2b5e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2b5f0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2b600 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2b610 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2b620 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2b630 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2b640 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2b650 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2b660 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2b670 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2b680 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2b690 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2b6a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2b6b0 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2b6c0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2b6d0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2b6e0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2b6f0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2b700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b710 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2b720 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2b730 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2b740 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2b750 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2b760 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2b770 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2b780 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2b790 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2b7a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2b7b0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2b7c0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2b7d0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2b7e0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2b7f0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2b800 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2b810 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2b820 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2b830 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2b840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b850 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b860 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2b870 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2b880 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2b890 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2b8a0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2b8b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b8c0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2b8d0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2b8e0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2b8f0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2b900 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2b910 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2b920 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2b930 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2b940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b950 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f  CORRUPT_BKPT;  /
2b960 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70  * Cell extends p
2b970 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20  ast end of page 
2b980 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e  */.  }.  ovflPgn
2b990 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  o = get4byte(&pC
2b9a0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2b9b0 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow]);.  assert( 
2b9c0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2b9d0 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
2b9e0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
2b9f0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
2ba00 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61  Ovfl = (info.nPa
2ba10 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  yload - info.nLo
2ba20 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
2ba30 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
2ba40 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
2ba50 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e  ovflPgno==0 || n
2ba60 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  Ovfl>0 );.  whil
2ba70 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
2ba80 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
2ba90 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2baa0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
2bab0 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
2bac0 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
2bad0 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
2bae0 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
2baf0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
2bb00 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
2bb10 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
2bb20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2bb30 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
2bb40 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
2bb50 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
2bb60 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
2bb70 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
2bb80 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
2bb90 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
2bba0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2bbb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2bbc0 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
2bbd0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
2bbe0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
2bbf0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
2bc00 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
2bc10 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2bc20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2bc30 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
2bc40 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
2bc50 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
2bc60 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
2bc70 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
2bc80 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
2bc90 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
2bca0 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
2bcb0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
2bcc0 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
2bcd0 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
2bce0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2bcf0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
2bd00 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
2bd10 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
2bd20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
2bd30 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
2bd40 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
2bd50 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
2bd60 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
2bd70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2bd80 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
2bd90 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
2bda0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
2bdb0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
2bdc0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
2bdd0 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2bde0 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
2bdf0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
2be00 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
2be10 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
2be20 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
2be30 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
2be40 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
2be50 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
2be60 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
2be70 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
2be80 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
2be90 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
2bea0 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
2beb0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
2bec0 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
2bed0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
2bee0 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
2bef0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
2bf00 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
2bf10 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
2bf20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2bf30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2bf40 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2bf50 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
2bf60 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
2bf70 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
2bf80 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
2bf90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2bfa0 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
2bfb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bfc0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
2bfd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
2bfe0 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
2bff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c000 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2c010 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
2c020 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
2c030 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
2c040 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
2c050 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
2c060 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
2c070 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
2c080 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
2c090 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
2c0a0 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
2c0b0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
2c0c0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
2c0d0 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
2c0e0 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
2c0f0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
2c100 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
2c110 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
2c120 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
2c130 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
2c140 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
2c150 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
2c160 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
2c170 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
2c180 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
2c190 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
2c1a0 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
2c1b0 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
2c1c0 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
2c1d0 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
2c1e0 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
2c1f0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
2c200 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
2c210 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
2c220 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
2c230 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
2c240 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2c250 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2c260 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
2c270 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2c280 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
2c290 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
2c2a0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
2c2b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
2c2c0 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
2c2d0 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
2c2e0 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2c2f0 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
2c300 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
2c310 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2c320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c330 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
2c340 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
2c350 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
2c360 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
2c370 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2c380 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
2c390 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
2c3a0 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
2c3b0 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
2c3c0 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
2c3d0 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
2c3e0 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2c3f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
2c400 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
2c410 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
2c420 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
2c430 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
2c440 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2c450 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
2c460 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
2c470 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
2c480 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
2c490 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
2c4a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c4b0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2c4c0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
2c4d0 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
2c4e0 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
2c4f0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
2c500 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
2c510 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
2c520 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
2c530 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
2c540 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
2c550 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
2c560 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
2c570 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
2c580 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2c590 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2c5a0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2c5b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2c5c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2c5d0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2c5e0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
2c5f0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  eader = 0;.  if(
2c600 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2c610 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2c620 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  4;.  }.  if( pPa
2c630 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
2c640 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
2c650 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
2c660 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e  Header], nData+n
2c670 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Zero);.  }else{.
2c680 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72      nData = nZer
2c690 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65  o = 0;.  }.  nHe
2c6a0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
2c6b0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
2c6c0 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29  ], *(u64*)&nKey)
2c6d0 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2c6e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2c6f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
2c700 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
2c710 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
2c720 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
2c730 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
2c740 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
2c750 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a  ==(u32)(nData+nZ
2c760 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  ero) );.  .  /* 
2c770 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
2c780 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61  oad */.  nPayloa
2c790 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72  d = nData + nZer
2c7a0 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  o;.  if( pPage->
2c7b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
2c7c0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2c7d0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
2c7e0 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
2c7f0 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e  else{ .    if( N
2c800 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66  EVER(nKey>0x7fff
2c810 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29  ffff || pKey==0)
2c820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c830 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2c840 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2c850 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
2c860 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
2c870 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
2c880 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
2c890 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
2c8a0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
2c8b0 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
2c8c0 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
2c8d0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
2c8e0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
2c8f0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
2c900 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
2c910 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
2c920 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
2c930 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
2c940 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2c950 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
2c960 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
2c970 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
2c980 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
2c990 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
2c9a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2c9b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2c9c0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
2c9d0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
2c9e0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
2c9f0 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
2ca00 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
2ca10 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
2ca20 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
2ca30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
2ca40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2ca50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
2ca60 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2ca70 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
2ca80 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
2ca90 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
2caa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cab0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2cac0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2cad0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
2cae0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
2caf0 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
2cb00 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
2cb10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
2cb20 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
2cb30 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
2cb40 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2cb50 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
2cb60 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
2cb70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2cb80 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2cb90 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
2cba0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
2cbb0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
2cbc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
2cbd0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
2cbe0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
2cbf0 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
2cc00 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
2cc10 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
2cc20 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
2cc30 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
2cc40 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
2cc50 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
2cc60 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
2cc70 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
2cc80 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
2cc90 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
2cca0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
2ccb0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
2ccc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
2ccd0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2cce0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2ccf0 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
2cd00 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
2cd10 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
2cd20 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
2cd30 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74  OW1);.        pt
2cd40 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2cd50 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67  oOvfl, eType, pg
2cd60 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a  noPtrmap, &rc);.
2cd70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2cd80 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
2cd90 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
2cda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2cdb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
2cdc0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2cdd0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
2cde0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
2cdf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ce00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
2ce10 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
2ce20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
2ce30 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
2ce40 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2ce50 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
2ce60 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
2ce70 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
2ce80 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
2ce90 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
2cea0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
2ceb0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2cec0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
2ced0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
2cee0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2cef0 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
2cf00 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
2cf10 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
2cf20 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
2cf30 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
2cf40 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
2cf50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
2cf60 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
2cf70 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
2cf80 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
2cf90 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
2cfa0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
2cfb0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2cfc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2cfd0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
2cfe0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
2cff0 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
2d000 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2d010 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
2d020 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
2d030 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
2d040 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
2d050 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2d060 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
2d070 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
2d080 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
2d090 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
2d0a0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
2d0b0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
2d0c0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
2d0d0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
2d0e0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
2d0f0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
2d100 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
2d110 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
2d120 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2d130 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
2d140 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
2d150 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
2d160 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
2d170 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
2d180 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
2d190 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
2d1a0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d1b0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
2d1c0 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
2d1d0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
2d1e0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
2d1f0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
2d200 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
2d210 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
2d220 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2d230 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
2d240 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
2d250 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
2d260 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2d270 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2d280 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2d290 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d2a0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2d2b0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
2d2c0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
2d2d0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
2d2e0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
2d2f0 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
2d300 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
2d310 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
2d320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
2d330 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
2d340 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
2d350 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
2d360 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
2d370 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
2d380 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
2d390 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
2d3a0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
2d3b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
2d3c0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
2d3d0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
2d3e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
2d3f0 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
2d400 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
2d410 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2d420 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
2d430 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
2d440 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2d450 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
2d460 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
2d470 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
2d480 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
2d490 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
2d4a0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
2d4b0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
2d4c0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
2d4d0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
2d4e0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
2d4f0 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
2d500 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2d510 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2d520 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
2d530 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
2d540 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
2d550 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ell..*/.static v
2d560 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d  oid dropCell(Mem
2d570 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2d580 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e   idx, int sz, in
2d590 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70  t *pRC){.  u32 p
2d5a0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
2d5b0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
2d5c0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
2d5d0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
2d5e0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2d5f0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
2d600 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
2d610 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
2d620 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
2d630 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
2d640 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b  */.  u8 *endPtr;
2d650 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
2d660 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  oop */.  int rc;
2d670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2d680 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
2d690 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2d6a0 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
2d6b0 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
2d6c0 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
2d6d0 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
2d6e0 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2d6f0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ..  assert( idx>
2d700 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
2d710 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
2d720 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2d730 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
2d740 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d750 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d760 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2d770 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d780 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d790 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d7a0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
2d7b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2d7c0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
2d7d0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
2d7e0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
2d7f0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
2d800 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
2d810 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
2d820 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
2d830 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
2d840 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
2d850 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2d860 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
2d870 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
2d880 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
2d890 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
2d8a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2d8b0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
2d8c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d8d0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
2d8e0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
2d8f0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
2d900 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
2d910 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2d920 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2d930 20 65 6e 64 50 74 72 20 3d 20 26 70 50 61 67 65   endPtr = &pPage
2d940 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 70 50 61  ->aCellIdx[2*pPa
2d950 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a  ge->nCell - 2];.
2d960 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
2d970 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72  E_PTR_TO_INT(ptr
2d980 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70  )&1)==0 );  /* p
2d990 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62  tr is always 2-b
2d9a0 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20  yte aligned */. 
2d9b0 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e 64 50   while( ptr<endP
2d9c0 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a  tr ){.    *(u16*
2d9d0 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70  )ptr = *(u16*)&p
2d9e0 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b  tr[2];.    ptr +
2d9f0 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 2;.  }.  pPage
2da00 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
2da10 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2da20 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2da30 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2da40 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
2da50 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
2da60 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
2da70 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
2da80 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
2da90 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
2daa0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
2dab0 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
2dac0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
2dad0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
2dae0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
2daf0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
2db00 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
2db10 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
2db20 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
2db30 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
2db40 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
2db50 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
2db60 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
2db70 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
2db80 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
2db90 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
2dba0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
2dbb0 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
2dbc0 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
2dbd0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
2dbe0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
2dbf0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
2dc00 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
2dc10 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
2dc20 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
2dc30 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
2dc40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
2dc50 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
2dc60 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
2dc70 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
2dc80 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
2dc90 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
2dca0 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
2dcb0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
2dcc0 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
2dcd0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2dce0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
2dcf0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2dd00 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
2dd10 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
2dd20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
2dd30 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
2dd40 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
2dd50 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
2dd60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2dd70 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
2dd80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2dd90 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
2dda0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
2ddb0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
2ddc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2ddd0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
2dde0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
2ddf0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
2de00 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
2de10 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2de20 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
2de30 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
2de40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
2de50 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
2de60 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
2de70 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
2de80 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
2de90 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
2dea0 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2deb0 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
2dec0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
2ded0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
2dee0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
2def0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
2df00 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
2df10 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
2df20 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
2df30 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
2df40 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
2df50 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
2df60 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
2df70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
2df80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2df90 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2dfa0 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
2dfb0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
2dfc0 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
2dfd0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2dfe0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
2dff0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
2e000 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
2e010 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
2e020 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
2e030 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
2e040 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
2e050 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
2e060 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2e070 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
2e080 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2e090 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2e0a0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
2e0b0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2e0c0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
2e0d0 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
2e0e0 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
2e0f0 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74  ] */.  u8 *endPt
2e100 72 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  r;       /* End 
2e110 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a  of the loop */..
2e120 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2e130 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2e140 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2e150 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2e160 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2e170 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2e180 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2e190 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2e1a0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2e1b0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2e1c0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2e1d0 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
2e1e0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2e1f0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
2e200 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
2e210 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
2e220 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
2e230 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
2e240 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
2e250 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e260 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2e270 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2e280 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
2e290 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
2e2a0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
2e2b0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
2e2c0 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
2e2d0 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
2e2e0 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
2e2f0 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
2e300 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
2e310 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
2e320 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
2e330 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
2e340 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
2e350 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
2e360 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
2e370 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
2e380 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
2e390 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
2e3a0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
2e3b0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
2e3c0 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
2e3d0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2e3e0 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
2e3f0 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2e400 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2e410 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
2e420 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
2e430 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2e440 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2e450 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2e460 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2e470 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2e480 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2e490 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2e4a0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2e4b0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2e4c0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2e4d0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2e4e0 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2e4f0 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2e500 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2e510 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2e520 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2e530 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  >apOvfl)/sizeof(
2e540 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d  pPage->apOvfl[0]
2e550 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  )) );.    pPage-
2e560 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65  >apOvfl[j] = pCe
2e570 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
2e580 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29  iOvfl[j] = (u16)
2e590 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
2e5a0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
2e5b0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2e5c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2e5d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e5e0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2e5f0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2e600 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rn;.    }.    as
2e610 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2e620 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2e630 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2e640 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
2e650 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65  e->aData;.    ce
2e660 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
2e670 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
2e680 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
2e690 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
2e6a0 65 6c 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  ell;.    ins = c
2e6b0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
2e6c0 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  .    rc = alloca
2e6d0 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73  teSpace(pPage, s
2e6e0 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66  z, &idx);.    if
2e6f0 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72  ( rc ){ *pRC = r
2e700 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20  c; return; }.   
2e710 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65   /* The allocate
2e720 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
2e730 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66  guarantees the f
2e740 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f  ollowing two pro
2e750 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
2e760 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
2e770 63 65 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65  cess */.    asse
2e780 72 74 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32  rt( idx >= end+2
2e790 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e7a0 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70  idx+sz <= (int)p
2e7b0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2e7c0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61  eSize );.    pPa
2e7d0 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20  ge->nCell++;.   
2e7e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2e7f0 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a   (u16)(2 + sz);.
2e800 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
2e810 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65  [idx+nSkip], pCe
2e820 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
2e830 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68  ip);.    if( iCh
2e840 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
2e850 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d  4byte(&data[idx]
2e860 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
2e870 0a 20 20 20 20 70 74 72 20 3d 20 26 64 61 74 61  .    ptr = &data
2e880 5b 65 6e 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74  [end];.    endPt
2e890 72 20 3d 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a  r = &data[ins];.
2e8a0 20 20 20 20 61 73 73 65 72 74 28 20 28 53 51 4c      assert( (SQL
2e8b0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
2e8c0 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a  tr)&1)==0 );  /*
2e8d0 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32   ptr is always 2
2e8e0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f  -byte aligned */
2e8f0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 74 72 3e  .    while( ptr>
2e900 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 20 20  endPtr ){.      
2e910 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75  *(u16*)ptr = *(u
2e920 31 36 2a 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20  16*)&ptr[-2];.  
2e930 20 20 20 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20      ptr -= 2;.  
2e940 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65    }.    put2byte
2e950 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78  (&data[ins], idx
2e960 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
2e970 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
2e980 4f 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65  Offset+3], pPage
2e990 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
2e9a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2e9b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2e9c0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
2e9d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
2e9e0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
2e9f0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
2ea00 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
2ea10 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
2ea20 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
2ea30 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
2ea40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
2ea50 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2ea60 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
2ea70 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2ea80 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2ea90 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
2eaa0 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
2eab0 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20  * Add a list of 
2eac0 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e  cells to a page.
2ead0 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c    The page shoul
2eae0 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65  d be initially e
2eaf0 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  mpty..** The cel
2eb00 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65  ls are guarantee
2eb10 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20  d to fit on the 
2eb20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
2eb30 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67  void assemblePag
2eb40 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
2eb50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61  age,   /* The pa
2eb60 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c  ge to be assembl
2eb70 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ied */.  int nCe
2eb80 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ll,        /* Th
2eb90 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  e number of cell
2eba0 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73  s to add to this
2ebb0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2ebc0 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  apCell,      /* 
2ebd0 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c  Pointers to cell
2ebe0 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36   bodies */.  u16
2ebf0 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f   *aSize        /
2ec00 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63  * Sizes of the c
2ec10 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
2ec20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   i;            /
2ec30 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
2ec40 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
2ec50 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2ec60 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
2ec70 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
2ec80 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
2ec90 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
2eca0 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
2ecb0 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
2ecc0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
2ecd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2ece0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
2ecf0 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  r pPage */.  con
2ed00 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
2ed10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
2ed20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2ed30 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
2ed40 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2ed50 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70   int nUsable = p
2ed60 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2ed70 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
2ed80 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f   size of page */
2ed90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2eda0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
2edb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2edc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2edd0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2ede0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2edf0 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
2ee00 6c 3c 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28  l<=(int)MX_CELL(
2ee10 70 50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20  pPage->pBt).    
2ee20 20 20 20 20 20 20 20 20 26 26 20 28 69 6e 74 29          && (int)
2ee30 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2ee40 42 74 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61  Bt)<=10921);.  a
2ee50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ee60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ee70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2ee80 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
2ee90 61 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  at the page has 
2eea0 6a 75 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64  just been zeroed
2eeb0 20 62 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a   by zeroPage() *
2eec0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
2eed0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
2eee0 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
2eef0 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
2ef00 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20  dr+5])==nUsable 
2ef10 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d  );..  pCellptr =
2ef20 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64   &pPage->aCellId
2ef30 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65  x[nCell*2];.  ce
2ef40 6c 6c 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65  llbody = nUsable
2ef50 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d  ;.  for(i=nCell-
2ef60 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
2ef70 20 20 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a     u16 sz = aSiz
2ef80 65 5b 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70  e[i];.    pCellp
2ef90 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c  tr -= 2;.    cel
2efa0 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20  lbody -= sz;.   
2efb0 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
2efc0 74 72 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  tr, cellbody);. 
2efd0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
2efe0 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c  cellbody], apCel
2eff0 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20  l[i], sz);.  }. 
2f000 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2f010 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2f020 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2f030 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2f040 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2f050 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2f060 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2f070 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2f080 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2f090 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2f0a0 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2f0b0 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2f0c0 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2f0d0 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2f0e0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2f0f0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2f100 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2f110 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2f120 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2f130 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2f140 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2f150 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2f160 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2f170 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2f180 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2f190 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2f1a0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2f1b0 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2f1c0 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2f1d0 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2f1e0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2f1f0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2f200 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2f210 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2f220 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2f230 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2f240 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2f250 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2f260 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2f270 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2f280 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2f290 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2f2a0 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2f2b0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2f2c0 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2f2d0 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2f2e0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2f2f0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2f300 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2f310 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f320 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2f330 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2f340 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2f350 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2f360 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2f370 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2f380 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2f390 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2f3a0 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2f3b0 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2f3c0 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2f3d0 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2f3e0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2f3f0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2f400 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2f410 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2f420 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2f430 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2f440 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2f450 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2f460 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2f470 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2f480 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2f490 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2f4a0 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20  ying to balance 
2f4b0 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74  the 3 right-most
2f4c0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73   leaf pages, jus
2f4d0 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70  t add.** a new p
2f4e0 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  age to the right
2f4f0 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70  -hand side and p
2f500 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65  ut the one new e
2f510 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20  ntry in.** that 
2f520 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76  page.  This leav
2f530 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64  es the right sid
2f540 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f  e of the tree so
2f550 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61  mewhat.** unbala
2f560 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20  nced.  But odds 
2f570 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c  are that we will
2f580 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65   be inserting ne
2f590 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20  w entries.** at 
2f5a0 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74  the end soon aft
2f5b0 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e  erwards so the n
2f5c0 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65  early empty page
2f5d0 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a   will quickly.**
2f5e0 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76   fill up.  On av
2f5f0 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  erage..**.** pPa
2f600 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70  ge is the leaf p
2f610 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65  age which is the
2f620 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65   right-most page
2f630 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
2f640 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20   pParent is its 
2f650 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d  parent.  pPage m
2f660 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c  ust have a singl
2f670 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79  e overflow entry
2f680 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73  .** which is als
2f690 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
2f6a0 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61   entry on the pa
2f6b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53  ge..**.** The pS
2f6c0 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75  pace buffer is u
2f6d0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74  sed to store a t
2f6e0 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66  emporary copy of
2f6f0 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20   the divider.** 
2f700 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62  cell that will b
2f710 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
2f720 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20  pParent. Such a 
2f730 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66  cell consists of
2f740 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67   a 4.** byte pag
2f750 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65  e number followe
2f760 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20  d by a variable 
2f770 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20  length integer. 
2f780 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
2f790 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79  s, at most 13 by
2f7a0 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70  tes. Hence the p
2f7b0 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73  Space buffer mus
2f7c0 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74  t be at.** least
2f7d0 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a   13 bytes in siz
2f7e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2f7f0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d   balance_quick(M
2f800 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2f810 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
2f820 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20   u8 *pSpace){.  
2f830 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20  BtShared *const 
2f840 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2f850 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44  ;    /* B-Tree D
2f860 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d  atabase */.  Mem
2f870 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Page *pNew;     
2f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f890 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
2f8a0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69  ated page */.  i
2f8b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
2f8e0 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  de */.  Pgno pgn
2f8f0 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  oNew;           
2f900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f910 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  Page number of p
2f920 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  New */..  assert
2f930 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f940 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2f950 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2f960 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2f970 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2f980 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
2f990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2f9a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  e->nOverflow==1 
2f9b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  );..  /* This er
2f9c0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  ror condition is
2f9d0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
2f9e0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
2f9f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
2fa00 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
2fa10 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2fa20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2fa30 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
2fa40 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
2fa50 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2fa60 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
2fa70 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
2fa80 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
2fa90 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
2faa0 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
2fab0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2fac0 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
2fad0 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
2fae0 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
2faf0 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
2fb00 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
2fb10 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2fb20 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
2fb30 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
2fb40 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
2fb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
2fb60 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
2fb70 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
2fb80 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
2fb90 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
2fba0 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
2fbb0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
2fbc0 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
2fbd0 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
2fbe0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2fbf0 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
2fc00 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2fc10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2fc20 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
2fc30 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
2fc40 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
2fc50 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
2fc60 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
2fc70 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
2fc80 45 41 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  EAF);.    assemb
2fc90 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
2fca0 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
2fcb0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2fcc0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
2fcd0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
2fce0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2fcf0 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68   map.    ** with
2fd00 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
2fd10 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61   new page, and a
2fd20 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20  ny pointer from 
2fd30 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  the .    ** cell
2fd40 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20   on the page to 
2fd50 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2fd60 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  . If either of t
2fd70 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72  hese.    ** oper
2fd80 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68  ations fails, th
2fd90 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
2fda0 20 73 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f   set, but the co
2fdb0 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66  ntents.    ** of
2fdc0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2fdd0 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70   are still manip
2fde0 75 6c 61 74 65 64 20 62 79 20 74 68 68 20 63 6f  ulated by thh co
2fdf0 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a  de below..    **
2fe00 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20   That is Ok, at 
2fe10 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
2fe20 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 67 75  arent page is gu
2fe30 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20  aranteed to.    
2fe40 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
2fe50 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67  dirty. Returning
2fe60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
2fe70 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20  ill cause a.    
2fe80 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64  ** rollback, und
2fe90 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73  oing any changes
2fea0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70 61 72   made to the par
2feb0 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ent page..    */
2fec0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2fed0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70  ACUUM ){.      p
2fee0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2fef0 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54  noNew, PTRMAP_BT
2ff00 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  REE, pParent->pg
2ff10 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
2ff20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d  if( szCell>pNew-
2ff30 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >minLocal ){.   
2ff40 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
2ff50 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c  flPtr(pNew, pCel
2ff60 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d  l, &rc);.      }
2ff70 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2ff80 20 43 72 65 61 74 65 20 61 20 64 69 76 69 64 65   Create a divide
2ff90 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74  r cell to insert
2ffa0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54   into pParent. T
2ffb0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  he divider cell.
2ffc0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20      ** consists 
2ffd0 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61 67 65  of a 4-byte page
2ffe0 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70 61 67   number (the pag
2fff0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67  e number of pPag
30000 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20  e) and.    ** a 
30010 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
30020 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69 63 68  key value (which
30030 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
30040 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20  e value as the. 
30050 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65     ** largest ke
30060 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20  y on pPage)..   
30070 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69   **.    ** To fi
30080 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  nd the largest k
30090 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67  ey value on pPag
300a0 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20 74 68  e, first find th
300b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20  e right-most .  
300c0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
300d0 67 65 2e 20 54 68 65 20 66 69 72 73 74 20 74 77  ge. The first tw
300e0 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73  o fields of this
300f0 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20   cell are the . 
30100 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e     ** record-len
30110 67 74 68 20 28 61 20 76 61 72 69 61 62 6c 65 20  gth (a variable 
30120 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61  length integer a
30130 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69  t most 32-bits i
30140 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61  n size).    ** a
30150 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  nd the key value
30160 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
30170 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79  gth integer, may
30180 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29   have any value)
30190 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
301a0 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28  st of the while(
301b0 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77  ...) loops below
301c0 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20   skips over the 
301d0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20  record-length.  
301e0 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20    ** field. The 
301f0 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e  second while(...
30200 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68  ) loop copies th
30210 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d  e key value from
30220 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c   the.    ** cell
30230 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74   on pPage into t
30240 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
30250 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65  ..    */.    pCe
30260 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
30270 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
30280 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  l-1);.    pStop 
30290 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
302a0 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c   while( (*(pCell
302b0 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70 43 65  ++)&0x80) && pCe
302c0 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20  ll<pStop );.    
302d0 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39  pStop = &pCell[9
302e0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28  ];.    while( ((
302f0 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43  *(pOut++) = *(pC
30300 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26  ell++))&0x80) &&
30310 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a   pCell<pStop );.
30320 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
30330 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
30340 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ell into pParent
30350 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43  . */.    insertC
30360 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61  ell(pParent, pPa
30370 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70  rent->nCell, pSp
30380 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d  ace, (int)(pOut-
30390 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20  pSpace),.       
303a0 20 20 20 20 20 20 20 20 30 2c 20 70 50 61 67 65          0, pPage
303b0 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20  ->pgno, &rc);.. 
303c0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69     /* Set the ri
303d0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
303e0 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20  r of pParent to 
303f0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
30400 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75   page. */.    pu
30410 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
30420 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
30430 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
30440 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
30450 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
30460 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
30470 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
30480 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30490 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
304a0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
304b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
304c0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69  CKBALANCE */..#i
304d0 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f 0./*.** This f
304e0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
304f0 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74   contribute anyt
30500 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72  hing to the oper
30510 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e  ation of SQLite.
30520 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69  .** it is someti
30530 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65  mes activated te
30540 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20  mporarily while 
30550 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72  debugging code r
30560 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66  esponsible .** f
30570 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74  or setting point
30580 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a  er-map entries..
30590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
305a0 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d  rmapCheckPages(M
305b0 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c  emPage **apPage,
305c0 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69   int nPage){.  i
305d0 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
305e0 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b  =0; i<nPage; i++
305f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20  ){.    Pgno n;. 
30600 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d     u8 e;.    Mem
30610 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70  Page *pPage = ap
30620 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53  Page[i];.    BtS
30630 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
30640 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73  ge->pBt;.    ass
30650 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
30660 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a  it );..    for(j
30670 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; j<pPage->nCe
30680 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; j++){.      
30690 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
306a0 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20       u8 *z;.    
306b0 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64   .      z = find
306c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a  Cell(pPage, j);.
306d0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
306e0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a  CellPtr(pPage, z
306f0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
30700 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
30710 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ow ){.        Pg
30720 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
30730 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72  te(&z[info.iOver
30740 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20  flow]);.        
30750 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f  ptrmapGet(pBt, o
30760 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  vfl, &e, &n);.  
30770 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
30780 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
30790 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
307a0 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OW1 );.      }. 
307b0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
307c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
307d0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
307e0 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20  t4byte(z);.     
307f0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
30800 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
30810 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
30820 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
30830 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
30840 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  REE );.      }. 
30850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
30860 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
30870 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
30880 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
30890 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
308a0 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
308b0 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
308c0 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29  , child, &e, &n)
308d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
308e0 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
308f0 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
30900 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  E );.    }.  }. 
30910 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
30920 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
30930 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
30940 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e   to copy the con
30950 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74  tents of the b-t
30960 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  ree node stored 
30970 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f  .** on page pFro
30980 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49  m to page pTo. I
30990 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73  f page pFrom was
309a0 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
309b0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f  , then.** the po
309c0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
309d0 73 20 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64  s for each child
309e0 20 70 61 67 65 20 61 72 65 20 75 70 64 61 74 65   page are update
309f0 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  d so that the.**
30a00 20 70 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f   parent page sto
30a10 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  red in the point
30a20 65 72 20 6d 61 70 20 69 73 20 70 61 67 65 20 70  er map is page p
30a30 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e  To. If pFrom con
30a40 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65  tained.** any ce
30a50 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f  lls with overflo
30a60 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c  w page pointers,
30a70 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73   then the corres
30a80 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a  ponding pointer.
30a90 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  ** map entries a
30aa0 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20  re also updated 
30ab0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 65  so that the pare
30ac0 6e 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  nt page is page 
30ad0 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  pTo..**.** If pF
30ae0 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  rom is currently
30af0 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76   carrying any ov
30b00 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e  erflow cells (en
30b10 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  tries in the.** 
30b20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d  MemPage.apOvfl[]
30b30 20 61 72 72 61 79 29 2c 20 74 68 65 79 20 61 72   array), they ar
30b40 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74 6f 20  e not copied to 
30b50 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  pTo. .**.** Befo
30b60 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 70 61  re returning, pa
30b70 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e 69 74  ge pTo is reinit
30b80 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20 62 74  ialized using bt
30b90 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
30ba0 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d  *.** The perform
30bb0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e  ance of this fun
30bc0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69  ction is not cri
30bd0 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c  tical. It is onl
30be0 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  y used by .** th
30bf0 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  e balance_shallo
30c00 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63  wer() and balanc
30c10 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f 63 65  e_deeper() proce
30c20 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f  dures, neither o
30c30 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63  f.** which are c
30c40 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65  alled often unde
30c50 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73  r normal circums
30c60 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tances..*/.stati
30c70 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43  c void copyNodeC
30c80 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a  ontent(MemPage *
30c90 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a  pFrom, MemPage *
30ca0 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  pTo, int *pRC){.
30cb0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
30cc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42  LITE_OK ){.    B
30cd0 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74 20  tShared * const 
30ce0 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  pBt = pFrom->pBt
30cf0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
30d00 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e   aFrom = pFrom->
30d10 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20 2a 20  aData;.    u8 * 
30d20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
30d30 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 20  >aData;.    int 
30d40 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
30d50 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
30d60 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  t;.    int const
30d70 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d   iToHdr = ((pTo-
30d80 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20  >pgno==1) ? 100 
30d90 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  : 0);.    int rc
30da0 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b  ;.    int iData;
30db0 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73 65 72  .  .  .    asser
30dc0 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74  t( pFrom->isInit
30dd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30de0 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54  pFrom->nFree>=iT
30df0 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  oHdr );.    asse
30e00 72 74 28 20 67 65 74 32 62 79 74 65 28 26 61 46  rt( get2byte(&aF
30e10 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29  rom[iFromHdr+5])
30e20 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
30e30 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20  ableSize );.  . 
30e40 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62     /* Copy the b
30e50 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
30e60 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
30e70 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
30e80 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d 20 67  */.    iData = g
30e90 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
30ea0 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20  FromHdr+5]);.   
30eb0 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 44 61   memcpy(&aTo[iDa
30ec0 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74  ta], &aFrom[iDat
30ed0 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  a], pBt->usableS
30ee0 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20 20 20  ize-iData);.    
30ef0 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54 6f 48  memcpy(&aTo[iToH
30f00 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f  dr], &aFrom[iFro
30f10 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65  mHdr], pFrom->ce
30f20 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 46 72  llOffset + 2*pFr
30f30 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20  om->nCell);.  . 
30f40 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69     /* Reinitiali
30f50 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20 74  ze page pTo so t
30f60 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
30f70 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
30f80 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a 2a  structure.    **
30f90 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64   match the new d
30fa0 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c  ata. The initial
30fb0 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63  ization of pTo c
30fc0 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61 69 6c  an actually fail
30fd0 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 66 61   under.    ** fa
30fe0 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63 69 72  irly obscure cir
30ff0 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76 65 6e  cumstances, even
31000 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 61 20   though it is a 
31010 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61 6c 69  copy of initiali
31020 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  zed .    ** page
31030 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20   pFrom..    */. 
31040 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d     pTo->isInit =
31050 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   0;.    rc = btr
31060 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b  eeInitPage(pTo);
31070 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31090 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
310a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
310b0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
310c0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
310d0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
310e0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
310f0 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20  map entries.    
31100 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
31110 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
31120 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
31130 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
31140 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a  inters to..    *
31150 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
31160 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
31170 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c 64 50  *pRC = setChildP
31180 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20 20 20  trmaps(pTo);.   
31190 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
311a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
311b0 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
311c0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
311d0 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
311e0 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
311f0 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
31200 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
31210 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
31220 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
31230 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
31240 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
31250 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
31260 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
31270 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
31280 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
31290 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
312a0 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
312b0 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
312c0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
312d0 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
312e0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
312f0 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
31300 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
31310 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
31320 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
31330 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
31340 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
31350 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
31360 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
31370 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
31380 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
31390 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
313a0 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
313b0 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
313c0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
313d0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
313e0 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
313f0 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
31400 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
31410 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
31420 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
31430 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
31440 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
31450 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
31460 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
31470 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
31480 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
31490 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
314a0 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
314b0 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
314c0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
314d0 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
314e0 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
314f0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
31500 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
31510 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
31520 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
31530 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
31540 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
31550 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
31560 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
31570 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
31580 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
31590 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
315a0 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
315b0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
315c0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
315d0 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
315e0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
315f0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
31600 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
31610 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
31620 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
31630 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
31640 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
31650 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
31660 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
31670 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
31680 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
31690 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
316a0 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
316b0 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
316c0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
316d0 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
316e0 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
316f0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
31700 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
31710 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
31720 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
31730 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
31740 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
31750 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
31760 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
31770 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
31780 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
31790 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
317a0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
317b0 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
317c0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
317d0 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
317e0 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  r big enough to 
317f0 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e 20 49  hold one page. I
31800 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74 69 6e  f while insertin
31810 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65  g cells into the
31820 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20   parent.** page 
31830 28 70 50 61 72 65 6e 74 29 20 74 68 65 20 70 61  (pParent) the pa
31840 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
31850 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 69 73  s overfull, this
31860 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 75 73   buffer is.** us
31870 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
31880 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f  parent's overflo
31890 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75 73 65  w cells. Because
318a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
318b0 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69  nserts.** a maxi
318c0 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69 76 69  mum of four divi
318d0 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
318e0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20  he parent page, 
318f0 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a  and the maximum.
31900 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63 65 6c  ** size of a cel
31910 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  l stored within 
31920 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  an internal node
31930 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73 73 20   is always less 
31940 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74  than 1/4.** of t
31950 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68  he page-size, th
31960 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62  e aOvflSpace[] b
31970 75 66 66 65 72 20 69 73 20 67 75 61 72 61 6e 74  uffer is guarant
31980 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 0a  eed to be large.
31990 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c  ** enough for al
319a0 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  l overflow cells
319b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c  ..**.** If aOvfl
319c0 53 70 61 63 65 20 69 73 20 73 65 74 20 74 6f 20  Space is set to 
319d0 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  a null pointer, 
319e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
319f0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
31a00 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 23 69 66 20 64  _NOMEM..*/.#if d
31a10 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
31a20 20 26 26 20 5f 4d 53 43 5f 56 45 52 20 3e 3d 20   && _MSC_VER >= 
31a30 31 37 30 30 20 26 26 20 64 65 66 69 6e 65 64 28  1700 && defined(
31a40 5f 4d 5f 41 52 4d 29 0a 23 70 72 61 67 6d 61 20  _M_ARM).#pragma 
31a50 6f 70 74 69 6d 69 7a 65 28 22 22 2c 20 6f 66 66  optimize("", off
31a60 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
31a70 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
31a80 6f 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oot(.  MemPage *
31a90 70 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20  pParent,        
31aa0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
31ab0 20 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67   page of sibling
31ac0 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64  s being balanced
31ad0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e   */.  int iParen
31ae0 74 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  tIdx,           
31af0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
31b00 66 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20  f "the page" in 
31b10 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20  pParent */.  u8 
31b20 2a 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20  *aOvflSpace,    
31b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31b40 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20  page-size bytes 
31b50 6f 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72  of space for par
31b60 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e  ent ovfl */.  in
31b70 74 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20  t isRoot,       
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31b90 20 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74   True if pParent
31ba0 20 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   is a root-page 
31bb0 2a 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20  */.  int bBulk  
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
31be0 74 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72  this call is par
31bf0 74 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64  t of a bulk load
31c00 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
31c10 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
31c20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
31c30 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
31c40 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c60 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
31c70 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
31c80 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
31c90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
31ca0 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
31cb0 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
31cc0 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
31cd0 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20  int nNew = 0;   
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31cf0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
31d00 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
31d10 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31d30 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
31d40 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
31d50 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31d70 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
31d80 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20  .  int nxDiv;   
31d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31da0 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20  /* Next divider 
31db0 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d  slot in pParent-
31dc0 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  >aCell[] */.  in
31dd0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31de0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
31df0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
31e00 0a 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65  .  u16 leafCorre
31e10 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
31e20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73  /* 4 if pPage is
31e30 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e   a leaf.  0 if n
31e40 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66  ot */.  int leaf
31e50 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
31e60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
31e70 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20  pPage is a leaf 
31e80 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72  of a LEAFDATA tr
31e90 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
31ea0 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  leSpace;        
31eb0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e       /* Bytes in
31ec0 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68   pPage beyond th
31ed0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
31ee0 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20  t pageFlags;    
31ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
31f00 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  lue of pPage->aD
31f10 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20  ata[0] */.  int 
31f20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20  subtotal;       
31f30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74           /* Subt
31f40 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e  otal of bytes in
31f50 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61   cells on one pa
31f60 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  ge */.  int iSpa
31f70 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce1 = 0;        
31f80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
31f90 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
31fa0 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace1[] */.  int 
31fb0 69 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20  iOvflSpace = 0; 
31fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
31fd0 74 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66  t unused byte of
31fe0 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f   aOvflSpace[] */
31ff0 0a 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68  .  int szScratch
32000 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32010 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74  /* Size of scrat
32020 63 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73  ch memory reques
32030 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ted */.  MemPage
32040 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20   *apOld[NB];    
32050 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
32060 6e 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62  nd up to two sib
32070 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  lings */.  MemPa
32080 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
32090 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
320a0 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
320b0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
320c0 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
320d0 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
320e0 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
320f0 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
32100 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
32110 20 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20   u8 *pRight;    
32120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32130 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72   Location in par
32140 65 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62  ent of right-sib
32150 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  ling pointer */.
32160 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31    u8 *apDiv[NB-1
32170 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
32180 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20  * Divider cells 
32190 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20  in pParent */.  
321a0 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d  int cntNew[NB+2]
321b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
321c0 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d  Index in aCell[]
321d0 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69   of cell after i
321e0 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  -th page */.  in
321f0 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  t szNew[NB+2];  
32200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
32210 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63  mbined size of c
32220 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d  ells place on i-
32230 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  th page */.  u8 
32240 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20  **apCell = 0;   
32250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
32260 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
32270 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
32280 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
32290 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c          /* Local
322a0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
322b0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a  ls in apCell[] *
322c0 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
322d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322e0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
322f0 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
32300 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f   cells */.  Pgno
32310 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
32320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
32330 20 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20   var to store a 
32340 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a  page number in *
32350 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65  /..  pBt = pPare
32360 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  nt->pBt;.  asser
32370 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
32380 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
32390 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
323a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
323b0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
323c0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66  pDbPage) );..#if
323d0 20 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c   0.  TRACE(("BAL
323e0 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65  ANCE: begin page
323f0 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c   %d child of %d\
32400 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
32410 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29   pParent->pgno))
32420 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
32430 74 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61  t this point pPa
32440 72 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74  rent may have at
32450 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c   most one overfl
32460 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a  ow cell. And if.
32470 20 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c    ** this overfl
32480 6f 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65  ow cell is prese
32490 6e 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74  nt, it must be t
324a0 68 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20  he cell with .  
324b0 2a 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74  ** index iParent
324c0 49 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72  Idx. This scenar
324d0 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77  io comes about w
324e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
324f0 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  n.  ** is called
32500 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72   (indirectly) fr
32510 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  om sqlite3BtreeD
32520 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  elete()..  */.  
32530 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
32540 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c  >nOverflow==0 ||
32550 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
32560 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  low==1 );.  asse
32570 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
32580 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
32590 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d  rent->aiOvfl[0]=
325a0 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a  =iParentIdx );..
325b0 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63    if( !aOvflSpac
325c0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
325d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
325e0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
325f0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
32600 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20  o balance. Also 
32610 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73  locate the cells
32620 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a   in pParent .  *
32630 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68  * that divide th
32640 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61  e siblings. An a
32650 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
32660 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e  o find NN siblin
32670 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68  gs on .  ** eith
32680 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
32690 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  . More siblings 
326a0 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f  are taken from o
326b0 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72  ne side, however
326c0 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  , .  ** if there
326d0 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20   are fewer than 
326e0 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74  NN siblings on t
326f0 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49  he other side. I
32700 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
32710 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
32720 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
32730 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
32740 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20  rent are taken. 
32750 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
32760 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73   loop also drops
32770 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
32780 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ls from the pare
32790 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20  nt page. This.  
327a0 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61  ** way, the rema
327b0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e  inder of the fun
327c0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68  ction does not h
327d0 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68  ave to deal with
327e0 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c   any.  ** overfl
327f0 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20  ow cells in the 
32800 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e  parent page, sin
32810 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65  ce if any existe
32820 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a  d they will.  **
32830 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
32840 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f  en removed..  */
32850 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
32860 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
32870 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
32880 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
32890 69 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  iv = 0;.  }else{
328a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75  .    assert( bBu
328b0 6c 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d  lk==0 || bBulk==
328c0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61  1 );.    if( iPa
328d0 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
328e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
328f0 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
32900 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
32910 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
32920 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
32930 2b 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73  +bBulk;.    }els
32940 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
32950 20 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20   bBulk==0 );.   
32960 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
32970 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
32980 20 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a     i = 2-bBulk;.
32990 20 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31    }.  nOld = i+1
329a0 3b 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76  ;.  if( (i+nxDiv
329b0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
329c0 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  low)==pParent->n
329d0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67  Cell ){.    pRig
329e0 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61  ht = &pParent->a
329f0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
32a00 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65  rOffset+8];.  }e
32a10 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20  lse{.    pRight 
32a20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
32a30 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
32a40 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
32a50 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65  .  }.  pgno = ge
32a60 74 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a  t4byte(pRight);.
32a70 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
32a80 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
32a90 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
32aa0 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20   &apOld[i]);.   
32ab0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32ac0 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
32ad0 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
32ae0 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
32af0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32b00 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20  eanup;.    }.   
32b10 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b   nMaxCells += 1+
32b20 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b  apOld[i]->nCell+
32b30 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66  apOld[i]->nOverf
32b40 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d  low;.    if( (i-
32b50 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  -)==0 ) break;..
32b60 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d      if( i+nxDiv=
32b70 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c  =pParent->aiOvfl
32b80 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e  [0] && pParent->
32b90 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
32ba0 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50     apDiv[i] = pP
32bb0 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d  arent->apOvfl[0]
32bc0 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67  ;.      pgno = g
32bd0 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d  et4byte(apDiv[i]
32be0 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69  );.      szNew[i
32bf0 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
32c00 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69  pParent, apDiv[i
32c10 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  ]);.      pParen
32c20 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  t->nOverflow = 0
32c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
32c40 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69     apDiv[i] = fi
32c50 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
32c60 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
32c70 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >nOverflow);.   
32c80 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
32c90 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
32ca0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63      szNew[i] = c
32cb0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
32cc0 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a  nt, apDiv[i]);..
32cd0 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68        /* Drop th
32ce0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20  e cell from the 
32cf0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44  parent page. apD
32d00 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e  iv[i] still poin
32d10 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  ts to.      ** t
32d20 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74  he cell within t
32d30 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20  he parent, even 
32d40 74 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65  though it has be
32d50 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20  en dropped..    
32d60 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66    ** This is saf
32d70 65 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69  e because droppi
32d80 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f  ng a cell only o
32d90 76 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69  verwrites the fi
32da0 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75  rst.      ** fou
32db0 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61  r bytes of it, a
32dc0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
32dd0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
32de0 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a  he first.      *
32df0 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  * four bytes of 
32e00 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
32e10 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  . So the pointer
32e20 20 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a   is safe to use.
32e30 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f        ** later o
32e40 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  n.  .      **.  
32e50 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69      ** But not i
32e60 66 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75  f we are in secu
32e70 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20  re-delete mode. 
32e80 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  In secure-delete
32e90 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20   mode,.      ** 
32ea0 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72  the dropCell() r
32eb0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72  outine will over
32ec0 77 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65  write the entire
32ed0 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65   cell with zeroe
32ee0 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  s..      ** In t
32ef0 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72  his case, tempor
32f00 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63  arily copy the c
32f10 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76  ell into the aOv
32f20 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  flSpace[].      
32f30 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69  ** buffer. It wi
32f40 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74  ll be copied out
32f50 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61   again as soon a
32f60 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62  s the aSpace[] b
32f70 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  uffer.      ** i
32f80 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f  s allocated.  */
32f90 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
32fa0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
32fb0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
32fc0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
32fd0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ;..        iOff 
32fe0 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
32ff0 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20  INT(apDiv[i]) - 
33000 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
33010 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  T(pParent->aData
33020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
33030 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28  iOff+szNew[i])>(
33040 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
33050 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
33060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
33070 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
33080 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
33090 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
330a0 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
330b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
330c0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
330d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
330e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
330f0 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d  aOvflSpace[iOff]
33100 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65  , apDiv[i], szNe
33110 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  w[i]);.         
33120 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
33130 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
33140 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
33150 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33160 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65    }.      dropCe
33170 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
33180 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
33190 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d  erflow, szNew[i]
331a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
331b0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
331c0 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
331d0 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
331e0 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
331f0 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
33200 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
33210 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
33220 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
33230 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
33240 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
33250 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
33260 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
33270 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
33280 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
33290 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
332a0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
332b0 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
332c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
332d0 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
332e0 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
332f0 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
33300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
33310 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
33320 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
33350 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
33360 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
33370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33390 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
333a0 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
333b0 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
333c0 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
333d0 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
333e0 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
333f0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
33400 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
33410 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
33420 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
33430 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
33440 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
33450 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
33460 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
33470 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
33480 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
33490 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
334a0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
334b0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
334c0 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
334d0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
334e0 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
334f0 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
33500 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
33510 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
33520 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
33530 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
33540 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
33550 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69  nd remove the di
33560 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
33570 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
33580 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
33590 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
335a0 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
335b0 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
335c0 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
335d0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
335e0 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
335f0 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
33600 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
33610 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
33620 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
33630 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
33640 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
33650 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
33660 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
33670 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
33680 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
33690 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
336a0 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
336b0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
336c0 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
336d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
336e0 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
336f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
33700 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
33710 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
33720 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
33730 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
33740 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
33750 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
33760 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
33770 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
33780 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
33790 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
337a0 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
337b0 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
337c0 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
337d0 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
337e0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
337f0 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
33800 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
33810 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
33820 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
33830 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
33840 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
33850 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
33860 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
33870 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
33880 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
33890 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
338a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
338b0 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
338c0 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
338d0 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
338e0 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
338f0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
33900 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
33910 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
33920 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
33930 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
33940 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
33950 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
33960 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
33970 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
33980 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
33990 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
339a0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
339b0 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
339c0 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
339d0 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
339e0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
339f0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
33a00 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
33a10 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
33a20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
33a30 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
33a40 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
33a50 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
33a60 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
33a70 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
33a80 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
33a90 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
33aa0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
33ab0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
33ac0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
33ad0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
33ae0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
33af0 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
33b00 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
33b10 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
33b20 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
33b30 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
33b40 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
33b50 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
33b60 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
33b70 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
33b80 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
33b90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
33ba0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
33bb0 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
33bc0 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
33bd0 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
33be0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
33bf0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
33c00 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
33c10 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
33c20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
33c30 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
33c40 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
33c50 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
33c60 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
33c70 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
33c80 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
33c90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
33ca0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
33cb0 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
33cc0 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
33cd0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
33ce0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
33cf0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
33d00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
33d10 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
33d20 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
33d30 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
33d40 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
33d50 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
33d60 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
33d70 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
33d80 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
33d90 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
33da0 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
33db0 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
33dc0 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
33dd0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
33de0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
33df0 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
33e00 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
33e10 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
33e20 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
33e30 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
33e40 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
33e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33e60 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
33e70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
33e80 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
33e90 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
33ea0 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
33eb0 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
33ec0 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
33ed0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
33ee0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
33ef0 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
33f00 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
33f10 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
33f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
33f30 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
33f40 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
33f50 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
33f60 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
33f70 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
33f80 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
33f90 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
33fa0 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
33fb0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
33fc0 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
33fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
33fe0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
33ff0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
34000 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
34010 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
34020 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
34030 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
34040 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
34050 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
34060 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
34070 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
34080 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
34090 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
340a0 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
340b0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
340c0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
340d0 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
340e0 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
340f0 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
34100 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
34110 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
34120 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
34130 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
34140 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
34150 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
34160 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
34170 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
34180 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
34190 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
341a0 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
341b0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
341c0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
341d0 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
341e0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
341f0 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
34200 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
34210 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34220 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
34230 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
34240 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
34250 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
34260 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
34270 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
34280 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
34290 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
342a0 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
342b0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
342c0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
342d0 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
342e0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
342f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
34300 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34310 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
34320 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
34330 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
34340 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
34350 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
34360 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
34370 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
34380 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
34390 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
343a0 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
343b0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
343c0 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
343d0 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
343e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
343f0 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
34400 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
34410 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
34420 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
34430 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
34440 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
34450 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
34460 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
34470 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
34480 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
34490 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
344a0 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
344b0 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
344c0 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
344d0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
344e0 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
344f0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
34500 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
34510 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
34520 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
34530 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
34540 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
34550 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
34560 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
34570 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
34580 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
34590 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
345a0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
345b0 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
345c0 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
345d0 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
345e0 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
345f0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
34600 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
34610 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
34620 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
34630 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
34640 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
34650 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
34660 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
34670 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
34680 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
34690 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
346a0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
346b0 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
346c0 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
346d0 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
346e0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
346f0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
34700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34710 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
34720 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
34730 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
34740 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
34750 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
34760 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
34770 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
34780 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
34790 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
347a0 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
347b0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
347c0 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
347d0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
347e0 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
347f0 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
34800 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20  szRight==0 .    
34810 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26     || (!bBulk &&
34820 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
34830 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
34840 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20  Cell[r]+2)) .   
34850 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
34860 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
34870 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
34880 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
34890 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
348a0 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
348b0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
348c0 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
348d0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
348e0 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
348f0 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
34900 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
34910 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
34920 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
34930 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
34940 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
34950 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
34960 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
34970 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
34980 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
34990 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
349a0 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
349b0 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
349c0 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
349d0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
349e0 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20  **.  ** UPDATE: 
349f0 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
34a00 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  low is not neces
34a10 73 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74  sarily true if t
34a20 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
34a30 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
34a40 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f  .  The corruptio
34a50 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74  n will be detect
34a60 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ed and reported 
34a70 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68  later.  ** in th
34a80 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20  is procedure so 
34a90 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
34aa0 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20   to act upon it 
34ab0 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  now..  */.#if 0.
34ac0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
34ad0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
34ae0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
34af0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
34b00 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52   );.#endif..  TR
34b10 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
34b20 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
34b30 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
34b40 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
34b50 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
34b60 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
34b70 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
34b80 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
34b90 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
34ba0 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
34bb0 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
34bc0 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
34bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
34be0 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
34bf0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
34c00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34c10 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
34c20 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
34c30 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
34c40 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
34c50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
34c60 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
34c70 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
34c80 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
34c90 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
34ca0 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
34cb0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
34cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34cd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
34ce0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
34cf0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
34d00 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
34d10 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34d30 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
34d40 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34d50 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34d60 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
34d70 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e  (bBulk ? 1 : pgn
34d80 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  o), 0);.      if
34d90 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
34da0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
34db0 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
34dc0 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
34dd0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
34de0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
34df0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
34e00 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
34e10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
34e20 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
34e30 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
34e40 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
34e50 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
34e60 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
34e70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34e90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
34ea0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34ec0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
34ed0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
34ee0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
34ef0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
34f00 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
34f10 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
34f20 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
34f30 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
34f40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
34f50 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
34f60 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34f70 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
34f80 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
34f90 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }..  /*.
34fa0 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77    ** Put the new
34fb0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
34fc0 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ing order.  This
34fd0 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b   helps to.  ** k
34fe0 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74  eep entries in t
34ff0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20  he disk file in 
35000 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20  order so that a 
35010 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65  scan.  ** of the
35020 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65   table is a line
35030 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20  ar scan through 
35040 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a  the file.  That.
35050 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c    ** in turn hel
35060 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ps the operating
35070 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76   system to deliv
35080 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72  er pages.  ** fr
35090 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65  om the disk more
350a0 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20   rapidly..  **. 
350b0 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e   ** An O(n^2) in
350c0 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67  sertion sort alg
350d0 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20  orithm is used, 
350e0 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e  but since.  ** n
350f0 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
35100 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20  han NB (a small 
35110 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20  constant), that 
35120 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20  should.  ** not 
35130 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  be a problem..  
35140 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d  **.  ** When NB=
35150 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74  =3, this one opt
35160 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20  imization makes 
35170 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
35180 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74  * about 25% fast
35190 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73  er for large ins
351a0 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65  ertions and dele
351b0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tions..  */.  fo
351c0 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b  r(i=0; i<k-1; i+
351d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56  +){.    int minV
351e0 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e   = apNew[i]->pgn
351f0 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20  o;.    int minI 
35200 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  = i;.    for(j=i
35210 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20  +1; j<k; j++){. 
35220 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a       if( apNew[j
35230 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65  ]->pgno<(unsigne
35240 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
35250 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
35260 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77      minV = apNew
35270 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [j]->pgno;.     
35280 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
35290 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20   minI>i ){.     
352a0 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
352b0 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69      pT = apNew[i
352c0 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
352d0 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
352e0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e  .      apNew[min
352f0 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20  I] = pT;.    }. 
35300 20 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77   }.  TRACE(("new
35310 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
35320 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
35330 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e  (%d)\n",.    apN
35340 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e  ew[0]->pgno, szN
35350 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e  ew[0],.    nNew>
35360 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70  =2 ? apNew[1]->p
35370 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32  gno : 0, nNew>=2
35380 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c   ? szNew[1] : 0,
35390 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61  .    nNew>=3 ? a
353a0 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[2]->pgno : 
353b0 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e  0, nNew>=3 ? szN
353c0 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[2] : 0,.    n
353d0 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33  New>=4 ? apNew[3
353e0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
353f0 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20  w>=4 ? szNew[3] 
35400 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35  : 0,.    nNew>=5
35410 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e   ? apNew[4]->pgn
35420 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f  o : 0, nNew>=5 ?
35430 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b   szNew[4] : 0));
35440 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
35450 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35460 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
35470 50 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62  Page) );.  put4b
35480 79 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65  yte(pRight, apNe
35490 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29  w[nNew-1]->pgno)
354a0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65  ;..  /*.  ** Eve
354b0 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74  nly distribute t
354c0 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c  he data in apCel
354d0 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e  l[] across the n
354e0 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49  ew pages..  ** I
354f0 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65  nsert divider ce
35500 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  lls into pParent
35510 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
35520 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66   */.  j = 0;.  f
35530 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
35540 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73  i++){.    /* Ass
35550 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69  emble the new si
35560 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
35570 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
35580 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
35590 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43   assert( j<nMaxC
355a0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f  ells );.    zero
355b0 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
355c0 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
355d0 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
355e0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
355f0 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
35600 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
35610 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
35620 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
35630 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
35640 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
35650 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
35660 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b  .    j = cntNew[
35670 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  i];..    /* If t
35680 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  he sibling page 
35690 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
356a0 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68  was not the righ
356b0 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a  t-most sibling,.
356c0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20      ** insert a 
356d0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
356e0 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
356f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
35700 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c  sert( i<nNew-1 |
35710 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  | j==nCell );.  
35720 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b    if( j<nCell ){
35730 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
35740 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
35750 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  p;.      int sz;
35760 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
35770 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  j<nMaxCells );. 
35780 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43       pCell = apC
35790 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a  ell[j];.      sz
357a0 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c   = szCell[j] + l
357b0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
357c0 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f       pTemp = &aO
357d0 76 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70  vflSpace[iOvflSp
357e0 61 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  ace];.      if( 
357f0 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pNew->leaf ){. 
35800 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
35810 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70  New->aData[8], p
35820 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20  Cell, 4);.      
35830 7d 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61  }else if( leafDa
35840 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
35850 20 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20   If the tree is 
35860 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
35870 2c 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e  , and the siblin
35880 67 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a  gs are leaves, .
35890 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
358a0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69  there is no divi
358b0 64 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65  der cell in apCe
358c0 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74  ll[]. Instead, t
358d0 68 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20  he divider .    
358e0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73      ** cell cons
358f0 69 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65  ists of the inte
35900 67 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20  ger key for the 
35910 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
35920 6f 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  of .        ** t
35930 68 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20  he sibling-page 
35940 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20  assembled above 
35950 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  only..        */
35960 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
35970 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
35980 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72  j--;.        btr
35990 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
359a0 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20  New, apCell[j], 
359b0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
359c0 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
359d0 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20         sz = 4 + 
359e0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
359f0 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b  [4], info.nKey);
35a00 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
35a10 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
35a20 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
35a30 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
35a40 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
35a50 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
35a60 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
35a70 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
35a80 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
35a90 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
35aa0 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
35ab0 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
35ac0 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
35ad0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
35ae0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
35af0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
35b00 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
35b10 28 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43  (see btreeParseC
35b20 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
35b30 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
35b40 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
35b50 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
35b60 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
35b70 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
35b80 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
35b90 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
35ba0 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
35bb0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
35bc0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
35bd0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
35be0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
35bf0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
35c00 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
35c10 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
35c20 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
35c30 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
35c40 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
35c50 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
35c60 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
35c70 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
35c80 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
35c90 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
35ca0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
35cb0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
35cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
35cd0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
35ce0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
35cf0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
35d00 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
35d10 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
35d20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66      }.      iOvf
35d30 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20  lSpace += sz;.  
35d40 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
35d50 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33  pBt->maxLocal+23
35d60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
35d70 28 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20  ( iOvflSpace <= 
35d80 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
35d90 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  ze );.      inse
35da0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
35db0 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a  nxDiv, pCell, sz
35dc0 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70  , pTemp, pNew->p
35dd0 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  gno, &rc);.     
35de0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35df0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
35e00 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
35e10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35e20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35e30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
35e40 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
35e50 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
35e60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
35e70 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
35e80 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
35e90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
35ea0 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
35eb0 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
35ec0 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
35ed0 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
35ee0 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
35ef0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
35f00 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
35f10 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
35f20 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
35f30 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
35f40 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
35f50 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
35f60 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
35f70 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
35f80 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
35f90 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
35fa0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
35fb0 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
35fc0 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
35fd0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
35fe0 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
35ff0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
36000 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
36010 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
36020 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
36030 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
36040 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
36050 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
36060 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
36070 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
36080 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
36090 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
360a0 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
360b0 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
360c0 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
360d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
360e0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
360f0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
36100 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
36110 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
36120 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
36130 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
36140 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
36150 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
36160 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
36170 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
36180 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
36190 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
361a0 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
361b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
361c0 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
361d0 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
361e0 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
361f0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
36200 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
36210 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
36220 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
36230 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
36240 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
36250 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
36260 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
36270 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
36280 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
36290 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
362a0 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
362b0 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
362c0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
362d0 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
362e0 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
362f0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
36300 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
36310 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
36320 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
36330 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
36340 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
36350 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65  (apNew[0], pPare
36360 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72  nt, &rc);.    fr
36370 65 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c  eePage(apNew[0],
36380 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69   &rc);.  }else i
36390 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
363a0 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68  ){.    /* Fix th
363b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
363c0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
363d0 65 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72  e cells that wer
363e0 65 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64  e shifted around
363f0 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  . .    ** There 
36400 61 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66  are several diff
36410 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70  erent types of p
36420 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
36430 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  es that need to.
36440 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
36450 77 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75  with by this rou
36460 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68  tine. Some of th
36470 65 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65  ese have been se
36480 74 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20  t already, but. 
36490 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20     ** many have 
364a0 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  not. The followi
364b0 6e 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a  ng is a summary:
364c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
364d0 20 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20   1) The entries 
364e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
364f0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
36500 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a  s that were not.
36510 20 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c      **      sibl
36520 69 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66  ings when this f
36530 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
36540 65 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61  ed. These have a
36550 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20  lready.    **   
36560 20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20     been set. We 
36570 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f  don't need to wo
36580 72 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69  rry about old si
36590 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65  blings that were
365a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76  .    **      mov
365b0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
365c0 69 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61  ist - the freePa
365d0 67 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61  ge() code has ta
365e0 6b 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  ken care.    ** 
365f0 20 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20       of those.. 
36600 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32     **.    **   2
36610 29 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  ) The pointer-ma
36620 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
36630 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
36640 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  rst overflow.   
36650 20 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e   **      page in
36660 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68   any overflow ch
36670 61 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77  ains used by new
36680 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20   divider cells. 
36690 54 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20  These .    **   
366a0 20 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72     have also alr
366b0 65 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20  eady been taken 
366c0 63 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69  care of by the i
366d0 6e 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65  nsertCell() code
366e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
366f0 20 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c    3) If the sibl
36700 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
36710 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
36720 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f  he child pages o
36730 66 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65  f.    **      ce
36740 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68  lls stored on th
36750 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
36760 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
36770 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
36780 20 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68     **   4) If th
36790 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
367a0 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c  are not internal
367b0 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74   intkey nodes, t
367c0 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20  hen any.    **  
367d0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
367e0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65  es used by these
367f0 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20   cells may need 
36800 74 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20  to be updated.  
36810 20 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72    **      (inter
36820 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
36830 20 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70   never contain p
36840 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66  ointers to overf
36850 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20  low pages)..    
36860 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49  **.    **   5) I
36870 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
36880 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76  ges are not leav
36890 65 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69  es, then the poi
368a0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
368b0 20 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72       entries for
368c0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
368d0 20 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73   pages of each s
368e0 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a  ibling may need.
368f0 20 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62      **      to b
36900 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
36910 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31  *.    ** Cases 1
36920 20 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74   and 2 are dealt
36930 20 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f   with above by o
36940 74 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e  ther code. The n
36950 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  ext.    ** block
36960 20 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65   deals with case
36970 73 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68  s 3 and 4 and th
36980 65 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74  e one after that
36990 2c 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a  , case 5. Since.
369a0 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61      ** setting a
369b0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
369c0 72 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65  ry is a relative
369d0 6c 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  ly expensive ope
369e0 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20  ration, this.   
369f0 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65   ** code only se
36a00 74 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  ts pointer map e
36a10 6e 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64  ntries for child
36a20 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   or overflow pag
36a30 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20  es that have.   
36a40 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76   ** actually mov
36a50 65 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73  ed between pages
36a60 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  .  */.    MemPag
36a70 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b  e *pNew = apNew[
36a80 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  0];.    MemPage 
36a90 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30  *pOld = apCopy[0
36aa0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72  ];.    int nOver
36ab0 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
36ac0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20  erflow;.    int 
36ad0 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d  iNextOld = pOld-
36ae0 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c  >nCell + nOverfl
36af0 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65  ow;.    int iOve
36b00 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c  rflow = (nOverfl
36b10 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  ow ? pOld->aiOvf
36b20 6c 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20  l[0] : -1);.    
36b30 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
36b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b50 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
36b60 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
36b70 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
36b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
36ba0 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
36bb0 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
36bc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
36bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
36be0 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
36bf0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
36c00 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
36c10 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
36c20 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
36c30 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
36c40 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
36c50 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
36c60 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
36c70 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
36c80 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
36c90 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
36ca0 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
36cb0 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
36cc0 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
36cd0 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ll. */.        a
36ce0 73 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72  ssert( j+1 < Arr
36cf0 61 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29  aySize(apCopy) )
36d00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
36d10 28 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a  ( j+1 < nOld );.
36d20 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61          pOld = a
36d30 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  pCopy[++j];.    
36d40 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69      iNextOld = i
36d50 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
36d60 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c  Old->nCell + pOl
36d70 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
36d80 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
36d90 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
36da0 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77         nOverflow
36db0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
36dc0 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ow;.          iO
36dd0 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c  verflow = i + !l
36de0 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
36df0 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20  aiOvfl[0];.     
36e00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
36e10 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
36e20 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
36e30 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
36e40 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
36e50 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
36e60 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
36e70 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76  <2 || pOld->aiOv
36e80 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f  fl[0]==pOld->aiO
36e90 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20  vfl[1]-1);.     
36ea0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
36eb0 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f  w<3 || pOld->aiO
36ec0 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69  vfl[1]==pOld->ai
36ed0 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20  Ovfl[2]-1);.    
36ee0 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
36ef0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
36f00 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
36f10 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
36f20 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
36f30 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
36f40 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
36f50 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
36f60 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
36f70 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
36f80 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
36f90 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
36fa0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
36fb0 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
36fc0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
36fd0 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
36fe0 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
36ff0 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
37000 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
37010 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
37020 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
37030 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
37040 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
37050 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
37060 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
37070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
37080 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
37090 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
370a0 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
370b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
370c0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
370d0 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
370e0 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
370f0 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
37100 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
37110 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
37120 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
37130 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
37140 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
37150 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
37160 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
37170 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
37180 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
37190 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
371a0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
371b0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
371c0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
371d0 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
371e0 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
371f0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
37200 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
37210 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
37220 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
37230 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
37240 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
37250 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
37260 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
37270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37280 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
37290 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
372a0 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
372b0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
372c0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
372d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
372e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
372f0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
37300 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
37310 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
37320 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
37330 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
37340 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
37350 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
37360 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
37370 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
37380 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
37390 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
373a0 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
373b0 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
373c0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
373d0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
373e0 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
373f0 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
37400 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
37410 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
37420 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
37430 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
37440 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
37450 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
37460 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
37470 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
37480 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
37490 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
374a0 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
374b0 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
374c0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
374d0 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
374e0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
374f0 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
37500 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
37510 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
37520 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
37530 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
37540 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
37550 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
37560 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
37570 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
37580 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
37590 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
375a0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
375b0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
375c0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
375d0 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
375e0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
375f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
37600 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
37610 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
37620 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
37630 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
37640 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
37650 63 3b 0a 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  c;.}.#if defined
37660 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
37670 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
37680 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
37690 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
376a0 7a 65 28 22 22 2c 20 6f 6e 29 0a 23 65 6e 64 69  ze("", on).#endi
376b0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  f.../*.** This f
376c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
376d0 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20  d when the root 
376e0 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
376f0 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a   structure is.**
37700 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f   overfull (has o
37710 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
37720 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a  low pages)..**.*
37730 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61  * A new child pa
37740 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ge is allocated 
37750 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
37760 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
37770 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e  root.** page, in
37780 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
37790 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69   cells, are copi
377a0 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c  ed into the chil
377b0 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  d. The root.** p
377c0 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72  age is then over
377d0 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20  written to make 
377e0 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  it an empty page
377f0 20 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d   with the right-
37800 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65  child .** pointe
37810 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  r pointing to th
37820 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a  e new page..**.*
37830 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * Before returni
37840 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d  ng, all pointer-
37850 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72  map entries corr
37860 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
37870 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  es .** that the 
37880 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e  new child-page n
37890 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e  ow contains poin
378a0 74 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61  ters to are upda
378b0 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72  ted. The.** entr
378c0 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  y corresponding 
378d0 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74  to the new right
378e0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
378f0 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  f the root.** pa
37900 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74  ge is also updat
37910 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
37920 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c  cessful, *ppChil
37930 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74  d is set to cont
37940 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
37950 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a  to the child .**
37960 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45   page and SQLITE
37970 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
37980 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
37990 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75  e caller is requ
379a0 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20  ired.** to call 
379b0 72 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e  releasePage() on
379c0 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c   *ppChild exactl
379d0 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72  y once. If an er
379e0 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61  ror occurs,.** a
379f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
37a00 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
37a10 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
37a20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
37a30 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
37a40 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20  MemPage *pRoot, 
37a50 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c  MemPage **ppChil
37a60 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  d){.  int rc;   
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
37a90 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
37aa0 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
37ab0 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30  Page *pChild = 0
37ac0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
37ad0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
37ae0 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20  child page */.  
37af0 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d  Pgno pgnoChild =
37b00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
37b10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
37b20 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
37b30 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
37b40 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e  d *pBt = pRoot->
37b50 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42  pBt;    /* The B
37b60 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Tree */..  asser
37b70 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  t( pRoot->nOverf
37b80 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  low>0 );.  asser
37b90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37ba0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
37bb0 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ) );..  /* Make 
37bc0 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20  pRoot, the root 
37bd0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
37be0 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c  ee, writable. Al
37bf0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20  locate a new .  
37c00 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ** page that wil
37c10 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
37c20 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20   right-child of 
37c30 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20  pPage. Copy the 
37c40 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  contents.  ** of
37c50 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64   the node stored
37c60 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74   on pRoot into t
37c70 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
37c80 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
37c90 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
37ca0 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
37cb0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
37cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
37cd0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
37ce0 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
37cf0 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
37d00 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63  ->pgno,0);.    c
37d10 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70  opyNodeContent(p
37d20 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72  Root, pChild, &r
37d30 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55  c);.    if( ISAU
37d40 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
37d50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
37d60 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
37d70 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
37d80 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
37d90 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20   }.  }.  if( rc 
37da0 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20  ){.    *ppChild 
37db0 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
37dc0 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
37dd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
37de0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37df0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37e00 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61  le(pChild->pDbPa
37e10 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
37e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
37e30 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
37e40 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
37e50 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43  sert( pChild->nC
37e60 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c  ell==pRoot->nCel
37e70 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22  l );..  TRACE(("
37e80 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f  BALANCE: copy ro
37e90 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22  ot %d into %d\n"
37ea0 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70  , pRoot->pgno, p
37eb0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  Child->pgno));..
37ec0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76    /* Copy the ov
37ed0 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f  erflow cells fro
37ee0 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c  m pRoot to pChil
37ef0 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43  d */.  memcpy(pC
37f00 68 69 6c 64 2d 3e 61 69 4f 76 66 6c 2c 20 70 52  hild->aiOvfl, pR
37f10 6f 6f 74 2d 3e 61 69 4f 76 66 6c 2c 0a 20 20 20  oot->aiOvfl,.   
37f20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76        pRoot->nOv
37f30 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
37f40 6f 6f 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 29 29  oot->aiOvfl[0]))
37f50 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  ;.  memcpy(pChil
37f60 64 2d 3e 61 70 4f 76 66 6c 2c 20 70 52 6f 6f 74  d->apOvfl, pRoot
37f70 2d 3e 61 70 4f 76 66 6c 2c 0a 20 20 20 20 20 20  ->apOvfl,.      
37f80 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66     pRoot->nOverf
37f90 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
37fa0 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  ->apOvfl[0]));. 
37fb0 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
37fc0 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
37fd0 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
37fe0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
37ff0 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
38000 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
38010 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
38020 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
38030 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
38040 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
38050 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
38060 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
38070 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
38080 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
38090 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
380a0 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
380b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
380c0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
380d0 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
380e0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
380f0 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
38100 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
38110 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
38120 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
38130 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
38140 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
38150 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
38160 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
38170 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
38180 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
38190 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
381a0 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
381b0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
381c0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
381d0 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
381e0 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
381f0 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
38200 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
38210 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
38220 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
38230 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
38240 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
38250 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
38260 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
38270 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
38280 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
38290 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
382a0 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
382b0 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
382c0 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
382d0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
382e0 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
382f0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
38300 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
38310 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
38320 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
38330 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
38340 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
38350 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
38360 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
38370 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
38380 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
38390 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
383a0 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
383b0 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
383c0 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
383d0 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
383e0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
383f0 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
38400 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
38410 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
38420 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
38430 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
38440 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
38450 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
38460 69 74 65 72 61 74 69 6f 6e 20 6f 66 2