mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-30 19:03:16 +03:00
Fix a problem with "PRAGMA foreign_key_check" where if a table in one
schema appears to have foreign key constraints against another table in a different schema, the pragma will try to check the constraints even though they do not apply because they are in different schemas. FossilOrigin-Name: 81bc4b65ae2a68128b0be75a7a3d4f47f05cc588ff130ba56366ab9b16289228
This commit is contained in:
13
manifest
13
manifest
@ -1,6 +1,6 @@
|
|||||||
B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
|
B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
|
||||||
C Minor\ssimplification\sto\sthe\s32-bit\svarint\sdecoder.
|
C Fix\sa\sproblem\swith\s"PRAGMA\sforeign_key_check"\swhere\sif\sa\stable\sin\sone\nschema\sappears\sto\shave\sforeign\skey\sconstraints\sagainst\sanother\stable\sin\na\sdifferent\sschema,\sthe\spragma\swill\stry\sto\scheck\sthe\sconstraints\seven\sthough\nthey\sdo\snot\sapply\sbecause\sthey\sare\sin\sdifferent\sschemas.
|
||||||
D 2020-07-02T17:05:11.341
|
D 2020-07-03T12:15:59.796
|
||||||
F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
|
F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
|
||||||
F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
|
F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
|
||||||
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
|
F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
|
||||||
@ -14,7 +14,7 @@ F src/btree.c e8e4a7e4727f0ead6433fdafeff347bf078fec39bee55a24441c3481e5b85164
|
|||||||
F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf
|
F src/btreeInt.h 19267385aa3bc00067d48e0e4ba83ae82dc08b0c15a3b3df20ea653cb462b5bf
|
||||||
F src/build.c ba1bbe563a3dc02d5fed20537603181e5289c13ea30ae5e775f552e7557adbfa
|
F src/build.c ba1bbe563a3dc02d5fed20537603181e5289c13ea30ae5e775f552e7557adbfa
|
||||||
F src/expr.c a3ab84399b3415f66d2d0c25f5bcd98ef465c0c07ea1f19bf2a418b1c8fcad74
|
F src/expr.c a3ab84399b3415f66d2d0c25f5bcd98ef465c0c07ea1f19bf2a418b1c8fcad74
|
||||||
F src/pragma.c 9085fc43b56497cbd88752cd7a9bca2c36ed52af5b56b1b089f8ddedc6b9b7ba
|
F src/pragma.c 1c6a435c92e913a65be9875c14bd2976fa1bf05b76a54785378c32b04fa34a00
|
||||||
F src/resolve.c 79cee37182fea66703f90365b8b0a646ed7e9bfa9238b91fa90dfc74258b940e
|
F src/resolve.c 79cee37182fea66703f90365b8b0a646ed7e9bfa9238b91fa90dfc74258b940e
|
||||||
F src/select.c 860daa05592ed1b38f6266f067fa020b539548ab929aa60fa59e7681e7f3f8cb
|
F src/select.c 860daa05592ed1b38f6266f067fa020b539548ab929aa60fa59e7681e7f3f8cb
|
||||||
F src/shell.c.in d663152487d4bfddea0f6d21ebc2ed51575d22657a02c6828afd344bbd4651af
|
F src/shell.c.in d663152487d4bfddea0f6d21ebc2ed51575d22657a02c6828afd344bbd4651af
|
||||||
@ -27,6 +27,7 @@ F test/altertab.test b8b2104212e8ea87c75c3cbe3cb78ed7236a6c828ee2e59ed09d3dbe981
|
|||||||
F test/busy2.test 415364312743992641f9bf679c84918327296067f85a5d00012b339dc35acbd7
|
F test/busy2.test 415364312743992641f9bf679c84918327296067f85a5d00012b339dc35acbd7
|
||||||
F test/decimal.test 12739a01bdba4c4d79f95b323e6b67b9fad1ab6ffb56116bd2b9c81a5b19e1d9
|
F test/decimal.test 12739a01bdba4c4d79f95b323e6b67b9fad1ab6ffb56116bd2b9c81a5b19e1d9
|
||||||
F test/filter1.test 6c483ecf7886c8843a8612c021aa23f33c581f584151f251842b3a3592c95ac8
|
F test/filter1.test 6c483ecf7886c8843a8612c021aa23f33c581f584151f251842b3a3592c95ac8
|
||||||
|
F test/fkey5.test bb2261477c66b2631391f5c98cfae1bc87c65fad02573eff122290e808b057ea
|
||||||
F test/fts3corrupt4.test 35e88f7708868a67598f1f6d3666774f6c7b34c91e3b74bd2965030fc70fb928
|
F test/fts3corrupt4.test 35e88f7708868a67598f1f6d3666774f6c7b34c91e3b74bd2965030fc70fb928
|
||||||
F test/fuzzdata8.db 0ae860b36b79fd41cafddc9e6602358b2d5c331cf200283221e659f86e196c0c
|
F test/fuzzdata8.db 0ae860b36b79fd41cafddc9e6602358b2d5c331cf200283221e659f86e196c0c
|
||||||
F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0
|
F test/gencol1.test b05e6c5edb9b10d48efb634ed07342441bddc89d225043e17095c36e567521a0
|
||||||
@ -37,7 +38,7 @@ F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfa
|
|||||||
F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
|
F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
|
||||||
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
|
F tool/showlocks.c 9cc5e66d4ebbf2d194f39db2527ece92077e86ae627ddd233ee48e16e8142564
|
||||||
F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
|
F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
|
||||||
P 27d4a9a7b530c77a5b2593d1a5232b10746da9906f8d12890de7a8fbd7270256
|
P 6ffd17b668a8ad561c37e89063afb6e7f8425e557e93025b7527fe3656585d77
|
||||||
R 99a7c16a071ee77c63747a35896341e7
|
R 5351216f77b38761a595d358da98b9c2
|
||||||
U drh
|
U drh
|
||||||
Z 9641430dad99b777a96753291abb3298
|
Z 5a3fead9e5239b45d904ac903a47c04e
|
||||||
|
@ -1 +1 @@
|
|||||||
6ffd17b668a8ad561c37e89063afb6e7f8425e557e93025b7527fe3656585d77
|
81bc4b65ae2a68128b0be75a7a3d4f47f05cc588ff130ba56366ab9b16289228
|
16
src/pragma.c
16
src/pragma.c
@ -1403,7 +1403,6 @@ void sqlite3Pragma(
|
|||||||
regRow = ++pParse->nMem;
|
regRow = ++pParse->nMem;
|
||||||
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash);
|
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash);
|
||||||
while( k ){
|
while( k ){
|
||||||
int iTabDb;
|
|
||||||
if( zRight ){
|
if( zRight ){
|
||||||
pTab = sqlite3LocateTable(pParse, 0, zRight, zDb);
|
pTab = sqlite3LocateTable(pParse, 0, zRight, zDb);
|
||||||
k = 0;
|
k = 0;
|
||||||
@ -1412,23 +1411,24 @@ void sqlite3Pragma(
|
|||||||
k = sqliteHashNext(k);
|
k = sqliteHashNext(k);
|
||||||
}
|
}
|
||||||
if( pTab==0 || pTab->pFKey==0 ) continue;
|
if( pTab==0 || pTab->pFKey==0 ) continue;
|
||||||
iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
|
iDb = sqlite3SchemaToIndex(db, pTab->pSchema);
|
||||||
sqlite3CodeVerifySchema(pParse, iTabDb);
|
zDb = db->aDb[iDb].zDbSName;
|
||||||
sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName);
|
sqlite3CodeVerifySchema(pParse, iDb);
|
||||||
|
sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
|
||||||
if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow;
|
if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow;
|
||||||
sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead);
|
sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead);
|
||||||
sqlite3VdbeLoadString(v, regResult, pTab->zName);
|
sqlite3VdbeLoadString(v, regResult, pTab->zName);
|
||||||
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
|
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
|
||||||
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
|
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
|
||||||
if( pParent==0 ) continue;
|
if( pParent==0 ) continue;
|
||||||
pIdx = 0;
|
pIdx = 0;
|
||||||
sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName);
|
sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName);
|
||||||
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
|
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
|
||||||
if( x==0 ){
|
if( x==0 ){
|
||||||
if( pIdx==0 ){
|
if( pIdx==0 ){
|
||||||
sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead);
|
sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead);
|
||||||
}else{
|
}else{
|
||||||
sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb);
|
sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb);
|
||||||
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
|
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
@ -430,4 +430,25 @@ do_catchsql_test 11.1 {
|
|||||||
PRAGMA foreign_key_check;
|
PRAGMA foreign_key_check;
|
||||||
} {1 {foreign key mismatch - "c11" referencing "tt"}}
|
} {1 {foreign key mismatch - "c11" referencing "tt"}}
|
||||||
|
|
||||||
|
# 2020-07-03 Bug in foreign_key_check discovered while working on the
|
||||||
|
# forum reports that pragma_foreign_key_check does not accept an argument:
|
||||||
|
# If two separate schemas seem to reference one another, that causes
|
||||||
|
# problems for foreign_key_check.
|
||||||
|
#
|
||||||
|
reset_db
|
||||||
|
do_execsql_test 12.0 {
|
||||||
|
ATTACH ':memory:' as aux;
|
||||||
|
CREATE TABLE aux.t1(a INTEGER PRIMARY KEY, b TEXT REFERENCES t2);
|
||||||
|
CREATE TABLE main.t2(x TEXT PRIMARY KEY, y INT);
|
||||||
|
INSERT INTO main.t2 VALUES('abc',11),('def',22),('xyz',99);
|
||||||
|
INSERT INTO aux.t1 VALUES(5,'abc'),(7,'xyz'),(9,'oops');
|
||||||
|
PRAGMA foreign_key_check=t1;
|
||||||
|
} {t1 5 t2 0 t1 7 t2 0 t1 9 t2 0}
|
||||||
|
do_execsql_test 12.1 {
|
||||||
|
CREATE TABLE aux.t2(x TEXT PRIMARY KEY, y INT);
|
||||||
|
INSERT INTO aux.t2 VALUES('abc',11),('def',22),('xyz',99);
|
||||||
|
PRAGMA foreign_key_check=t1;
|
||||||
|
} {t1 9 t2 0}
|
||||||
|
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user