Increase the upper bound on SQLITE_MAX_ATTACHED from 30 to 62.

FossilOrigin-Name: 7aaf8772274422f5020fad9eea490e195170720f
This commit is contained in:
drh 2011-03-23 18:22:34 +00:00
parent 0370493760
commit 01c7dc887c
8 changed files with 61 additions and 40 deletions

View File

@ -1,5 +1,8 @@
C Fix\sa\sbug\sin\sfts4\sto\sdo\swith\smatchinfo\sand\sdeferred\stokens. -----BEGIN PGP SIGNED MESSAGE-----
D 2011-03-23T17:10:44 Hash: SHA1
C Increase\sthe\supper\sbound\son\sSQLITE_MAX_ATTACHED\sfrom\s30\sto\s62.
D 2011-03-23T18:22:34.232
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f F Makefile.in 27701a1653595a1f2187dc61c8117e00a6c1d50f
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -124,7 +127,7 @@ F src/btmutex.c 96a12f50f7a17475155971a241d85ec5171573ff
F src/btree.c 43302cc4f3de6479b90fa6bb271b65d86333d00e F src/btree.c 43302cc4f3de6479b90fa6bb271b65d86333d00e
F src/btree.h e2f2cd9933bf30724f53ffa12c4c5a3a864bbd6e F src/btree.h e2f2cd9933bf30724f53ffa12c4c5a3a864bbd6e
F src/btreeInt.h 20f73dc93b1eeb83afd7259fbc6bd7dcf2df7fe4 F src/btreeInt.h 20f73dc93b1eeb83afd7259fbc6bd7dcf2df7fe4
F src/build.c 3b86c8efc0cbe716d82c510463f448b9cdee0619 F src/build.c 821d4b3c6b1da068a4eb1e9c8c414b75612d34c2
F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc F src/callback.c 5069f224882cbdccd559f591271d28d7f37745bc
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01
@ -143,7 +146,7 @@ F src/journal.c 552839e54d1bf76fb8f7abe51868b66acacf6a0e
F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f
F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e
F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e F src/loadext.c 8af9fcc75708d60b88636ccba38b4a7b3c155c3e
F src/main.c 6d10370bfc2235b7d6cf78510b20c94c00123357 F src/main.c 3679460ba5ee8f842e32def2117d5bd2260cdbf0
F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1 F src/malloc.c 92d59a007d7a42857d4e9454aa25b6b703286be1
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206 F src/mem1.c 00bd8265c81abb665c48fea1e0c234eb3b922206
@ -180,7 +183,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944
F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a
F src/sqlite.h.in 9d85096265a53db6c9d452eb478d5ced15308275 F src/sqlite.h.in 9d85096265a53db6c9d452eb478d5ced15308275
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
F src/sqliteInt.h 1de0edab31cc9e5c2f3540e08e8b97926f84bfeb F src/sqliteInt.h f8f1d00a22c98fd3f2fbc94da74eeb880879f89f
F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44
F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc F src/status.c 4997380fbb915426fef9e500b4872e79c99267fc
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@ -233,9 +236,9 @@ F src/util.c cd997077bad039efc0597eb027c929658f93c018
F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f F src/vacuum.c 924bd1bcee2dfb05376f79845bd3b4cec7b54b2f
F src/vdbe.c 8430780c643bf67d4b5da27f24d6ad39804fdaf4 F src/vdbe.c 8430780c643bf67d4b5da27f24d6ad39804fdaf4
F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2
F src/vdbeInt.h 6e6f28e9bccc6c703dca1372fd661c57b5c15fb0 F src/vdbeInt.h e1c6254641168507d25b46affb6dfb53c782f553
F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c
F src/vdbeaux.c 00439455c80ff7b37d7f2e5be5c0cf02de732a42 F src/vdbeaux.c cfd3f3ac674691ba1166ceb9a2698b0d00b2ef91
F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562 F src/vdbeblob.c c3ccb7c8732858c680f442932e66ad06bb036562
F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b
F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5 F src/vdbetrace.c 3ba13bc32bdf16d2bdea523245fd16736bed67b5
@ -263,7 +266,7 @@ F test/async2.test bf5e2ca2c96763b4cba3d016249ad7259a5603b6
F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e F test/async3.test 93edaa9122f498e56ea98c36c72abc407f4fb11e
F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a
F test/async5.test f3592d79c84d6e83a5f50d3fd500445f7d97dfdf F test/async5.test f3592d79c84d6e83a5f50d3fd500445f7d97dfdf
F test/attach.test f2b4ac6931f45695082b9f02be959c9c262e4f4d F test/attach.test 2bb09073d7d5499127db00f50780766dcea913e1
F test/attach2.test a295d2d7061adcee5884ef4a93c7c96a82765437 F test/attach2.test a295d2d7061adcee5884ef4a93c7c96a82765437
F test/attach3.test bd9830bc3a0d22ed1310c9bff6896927937017dc F test/attach3.test bd9830bc3a0d22ed1310c9bff6896927937017dc
F test/attachmalloc.test 1d5b821a676f7bf0b00d87cc106b78966789ba57 F test/attachmalloc.test 1d5b821a676f7bf0b00d87cc106b78966789ba57
@ -915,7 +918,14 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P 1ed5e361ca7bfa9226fec265704394e0f228f0c5 P 30d42dc66f19ef5cc5b27d6273eadf56619a3ce8
R 2f8b1c68ec4ce4809965697dec333ba6 R 53e5c0654506b9d27fce0da478ef2182
U dan U drh
Z 998dcc0bc86840532e7dbf16c79e79d3 Z af69b516e428dca392e47d50225e2cb4
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFNijptoxKgR168RlERAqbvAJ9dZZGQfzqQkUsnDColXnPTvyc73wCdHwqj
BdLhxD0af4MbaUFMS6jVKTQ=
=BE7n
-----END PGP SIGNATURE-----

View File

@ -1 +1 @@
30d42dc66f19ef5cc5b27d6273eadf56619a3ce8 7aaf8772274422f5020fad9eea490e195170720f

View File

@ -148,7 +148,7 @@ void sqlite3FinishCoding(Parse *pParse){
** on each used database. ** on each used database.
*/ */
if( pParse->cookieGoto>0 ){ if( pParse->cookieGoto>0 ){
u32 mask; tAttachMask mask;
int iDb; int iDb;
sqlite3VdbeJumpHere(v, pParse->cookieGoto-1); sqlite3VdbeJumpHere(v, pParse->cookieGoto-1);
for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){ for(iDb=0, mask=1; iDb<db->nDb; mask<<=1, iDb++){
@ -3444,12 +3444,12 @@ void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
} }
if( iDb>=0 ){ if( iDb>=0 ){
sqlite3 *db = pToplevel->db; sqlite3 *db = pToplevel->db;
int mask; tAttachMask mask;
assert( iDb<db->nDb ); assert( iDb<db->nDb );
assert( db->aDb[iDb].pBt!=0 || iDb==1 ); assert( db->aDb[iDb].pBt!=0 || iDb==1 );
assert( iDb<SQLITE_MAX_ATTACHED+2 ); assert( iDb<SQLITE_MAX_ATTACHED+2 );
mask = 1<<iDb; mask = ((tAttachMask)1)<<iDb;
if( (pToplevel->cookieMask & mask)==0 ){ if( (pToplevel->cookieMask & mask)==0 ){
pToplevel->cookieMask |= mask; pToplevel->cookieMask |= mask;
pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie; pToplevel->cookieValue[iDb] = db->aDb[iDb].pSchema->schema_cookie;
@ -3476,7 +3476,7 @@ void sqlite3CodeVerifySchema(Parse *pParse, int iDb){
void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){ void sqlite3BeginWriteOperation(Parse *pParse, int setStatement, int iDb){
Parse *pToplevel = sqlite3ParseToplevel(pParse); Parse *pToplevel = sqlite3ParseToplevel(pParse);
sqlite3CodeVerifySchema(pParse, iDb); sqlite3CodeVerifySchema(pParse, iDb);
pToplevel->writeMask |= 1<<iDb; pToplevel->writeMask |= ((tAttachMask)1)<<iDb;
pToplevel->isMultiWrite |= setStatement; pToplevel->isMultiWrite |= setStatement;
} }

View File

@ -1723,8 +1723,8 @@ static const int aHardLimit[] = {
#if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000 #if SQLITE_MAX_FUNCTION_ARG<0 || SQLITE_MAX_FUNCTION_ARG>1000
# error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000 # error SQLITE_MAX_FUNCTION_ARG must be between 0 and 1000
#endif #endif
#if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>30 #if SQLITE_MAX_ATTACHED<0 || SQLITE_MAX_ATTACHED>62
# error SQLITE_MAX_ATTACHED must be between 0 and 30 # error SQLITE_MAX_ATTACHED must be between 0 and 62
#endif #endif
#if SQLITE_MAX_LIKE_PATTERN_LENGTH<1 #if SQLITE_MAX_LIKE_PATTERN_LENGTH<1
# error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1 # error SQLITE_MAX_LIKE_PATTERN_LENGTH must be at least 1

View File

@ -2125,6 +2125,13 @@ struct TriggerPrg {
TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */ TriggerPrg *pNext; /* Next entry in Parse.pTriggerPrg list */
}; };
/* Datatype for the bitmask of all attached databases */
#if SQLITE_MAX_ATTACHED>30
typedef sqlite3_uint64 tAttachMask;
#else
typedef unsigned int tAttachMask;
#endif
/* /*
** An SQL parser context. A copy of this structure is passed through ** An SQL parser context. A copy of this structure is passed through
** the parser and down into all the parser action routine in order to ** the parser and down into all the parser action routine in order to
@ -2173,8 +2180,8 @@ struct Parse {
int iReg; /* Reg with value of this column. 0 means none. */ int iReg; /* Reg with value of this column. 0 means none. */
int lru; /* Least recently used entry has the smallest value */ int lru; /* Least recently used entry has the smallest value */
} aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */ } aColCache[SQLITE_N_COLCACHE]; /* One for each column cache entry */
u32 writeMask; /* Start a write transaction on these databases */ tAttachMask writeMask; /* Start a write transaction on these databases */
u32 cookieMask; /* Bitmask of schema verified databases */ tAttachMask cookieMask; /* Bitmask of schema verified databases */
u8 isMultiWrite; /* True if statement may affect/insert multiple rows */ u8 isMultiWrite; /* True if statement may affect/insert multiple rows */
u8 mayAbort; /* True if statement may throw an ABORT exception */ u8 mayAbort; /* True if statement may throw an ABORT exception */
int cookieGoto; /* Address of OP_Goto to cookie verifier subroutine */ int cookieGoto; /* Address of OP_Goto to cookie verifier subroutine */

View File

@ -302,7 +302,7 @@ struct Vdbe {
u8 readOnly; /* True for read-only statements */ u8 readOnly; /* True for read-only statements */
u8 isPrepareV2; /* True if prepared with prepare_v2() */ u8 isPrepareV2; /* True if prepared with prepare_v2() */
int nChange; /* Number of db changes made since last reset */ int nChange; /* Number of db changes made since last reset */
int btreeMask; /* Bitmask of db->aDb[] entries referenced */ tAttachMask btreeMask; /* Bitmask of db->aDb[] entries referenced */
int iStatement; /* Statement number (or 0 if has not opened stmt) */ int iStatement; /* Statement number (or 0 if has not opened stmt) */
int aCounter[3]; /* Counters used by sqlite3_stmt_status() */ int aCounter[3]; /* Counters used by sqlite3_stmt_status() */
BtreeMutexArray aMutex; /* An array of Btree used here and needing locks */ BtreeMutexArray aMutex; /* An array of Btree used here and needing locks */

View File

@ -950,8 +950,8 @@ static char *displayP4(Op *pOp, char *zTemp, int nTemp){
** in order (and released in reverse order) to avoid deadlocks. ** in order (and released in reverse order) to avoid deadlocks.
*/ */
void sqlite3VdbeUsesBtree(Vdbe *p, int i){ void sqlite3VdbeUsesBtree(Vdbe *p, int i){
int mask; tAttachMask mask;
assert( i>=0 && i<p->db->nDb && i<sizeof(u32)*8 ); assert( i>=0 && i<p->db->nDb && i<sizeof(tAttachMask)*8 );
assert( i<(int)sizeof(p->btreeMask)*8 ); assert( i<(int)sizeof(p->btreeMask)*8 );
mask = ((u32)1)<<i; mask = ((u32)1)<<i;
if( (p->btreeMask & mask)==0 ){ if( (p->btreeMask & mask)==0 ){

View File

@ -152,14 +152,16 @@ do_test attach-1.18 {
ATTACH 'test.db' as db11; ATTACH 'test.db' as db11;
} }
} {0 {}} } {0 {}}
do_test attach-1.19 { if {$SQLITE_MAX_ATTACHED==10} {
catchsql { do_test attach-1.19 {
ATTACH 'test.db' as db12; catchsql {
} ATTACH 'test.db' as db12;
} {1 {too many attached databases - max 10}} }
do_test attach-1.19.1 { } {1 {too many attached databases - max 10}}
db errorcode do_test attach-1.19.1 {
} {1} db errorcode
} {1}
}
do_test attach-1.20.1 { do_test attach-1.20.1 {
execsql { execsql {
DETACH db5; DETACH db5;
@ -179,14 +181,16 @@ do_test attach-1.21 {
ATTACH 'test.db' as db12; ATTACH 'test.db' as db12;
} }
} {0 {}} } {0 {}}
do_test attach-1.22 { if {$SQLITE_MAX_ATTACHED==10} {
catchsql { do_test attach-1.22 {
ATTACH 'test.db' as db13; catchsql {
} ATTACH 'test.db' as db13;
} {1 {too many attached databases - max 10}} }
do_test attach-1.22.1 { } {1 {too many attached databases - max 10}}
db errorcode do_test attach-1.22.1 {
} {1} db errorcode
} {1}
}
do_test attach-1.23 { do_test attach-1.23 {
catchsql { catchsql {
DETACH "db14"; DETACH "db14";