-C Fix\sthe\sregexp\sused\sto\srecognize\slibdl\serrors\son\sOS-X.
-D 2018-11-17T14:59:35.957
+C Fix\sproblems\sin\spragma.c\scausing\ssome\sPRAGMA\sstatements\sto\stest\sthe\swrong\nschema-cookie\sbefore\sproceeding,\sor\sto\stry\sto\sopen\scursors\son\sthe\swrong\ndatabase\s("PRAGMA\sforeign_key_check"\sonly).
+D 2018-11-20T18:09:59.541
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in b730006b54c990461d864c5387f2e6f13aadb0236804555fb010ed6865a5f058
F src/pcache.c 4196eb6ed3bbf00b80596c8e0b4f50e57eb7d890c19fb27a7354306abb7f983d
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
-F src/pragma.c 3a5f39517cbe90af3271fb5dd2866a50fbcf4ced6cb464dcc80a6f763b415206
+F src/pragma.c a2eab23fbf7c70c28f3a22629de2662d052c22853649430be302b910719574de
F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
F src/prepare.c f81f8d707e583192c28fea0b2e19385415b7d188123b23f49b038076408d7a69
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867
F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f
F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c0df9
-F test/pragma4.test 3046501bee2f652dc2a4f9c87781e2741361d6864439c8381aba6c3b774b335c
+F test/pragma4.test 12d0088e52d4e193f57eb0271d194ec1d7bc2031d874f915541f1b0ff80bb407
F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983
F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8
F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5fff00b0d5eb634d40e767671d5a0e8bd263d15d88abe531f6072f01bc789568
-R 76c317bc545b1ccc5ede987ad2f5f352
-U drh
-Z 5574305e87d3c067cc9d9e5ce2644399
+P 1740025307531a52e4f0641e2e74dc14715130858f2e9236be13b66924f00220
+R 35a6cb673896deb85e5c526c77cba232
+U dan
+Z a1b91470ee9a425f325e6bef367d324c
-1740025307531a52e4f0641e2e74dc14715130858f2e9236be13b66924f00220
\ No newline at end of file
+6982f52f579d20b8a2965373731d41622bda7f09fbf82cc005bb378321829f4c
\ No newline at end of file
Table *pTab;
pTab = sqlite3LocateTable(pParse, LOCATE_NOERR, zRight, zDb);
if( pTab ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int i, k;
int nHidden = 0;
Column *pCol;
Index *pPk = sqlite3PrimaryKeyIndex(pTab);
pParse->nMem = 7;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
sqlite3ViewGetColumnNames(pParse, pTab);
for(i=0, pCol=pTab->aCol; i<pTab->nCol; i++, pCol++){
int isHidden = IsHiddenColumn(pCol);
Table *pTab;
pIdx = sqlite3FindIndex(db, zRight, zDb);
if( pIdx ){
+ int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema);
int i;
int mx;
if( pPragma->iArg ){
pParse->nMem = 3;
}
pTab = pIdx->pTable;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iIdxDb);
assert( pParse->nMem<=pPragma->nPragCName );
for(i=0; i<mx; i++){
i16 cnum = pIdx->aiColumn[i];
int i;
pTab = sqlite3FindTable(db, zRight, zDb);
if( pTab ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
pParse->nMem = 5;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
for(pIdx=pTab->pIndex, i=0; pIdx; pIdx=pIdx->pNext, i++){
const char *azOrigin[] = { "c", "u", "pk" };
sqlite3VdbeMultiLoad(v, 1, "isisi",
if( pTab ){
pFK = pTab->pFKey;
if( pFK ){
+ int iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
int i = 0;
pParse->nMem = 8;
- sqlite3CodeVerifySchema(pParse, iDb);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
while(pFK){
int j;
for(j=0; j<pFK->nCol; j++){
pParse->nMem += 4;
regKey = ++pParse->nMem;
regRow = ++pParse->nMem;
- sqlite3CodeVerifySchema(pParse, iDb);
k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash);
while( k ){
+ int iTabDb;
if( zRight ){
pTab = sqlite3LocateTable(pParse, 0, zRight, zDb);
k = 0;
k = sqliteHashNext(k);
}
if( pTab==0 || pTab->pFKey==0 ) continue;
- sqlite3TableLock(pParse, iDb, pTab->tnum, 0, pTab->zName);
+ iTabDb = sqlite3SchemaToIndex(db, pTab->pSchema);
+ sqlite3CodeVerifySchema(pParse, iTabDb);
+ sqlite3TableLock(pParse, iTabDb, pTab->tnum, 0, pTab->zName);
if( pTab->nCol+regRow>pParse->nMem ) pParse->nMem = pTab->nCol + regRow;
- sqlite3OpenTable(pParse, 0, iDb, pTab, OP_OpenRead);
+ sqlite3OpenTable(pParse, 0, iTabDb, pTab, OP_OpenRead);
sqlite3VdbeLoadString(v, regResult, pTab->zName);
for(i=1, pFK=pTab->pFKey; pFK; i++, pFK=pFK->pNextFrom){
pParent = sqlite3FindTable(db, pFK->zTo, zDb);
if( pParent==0 ) continue;
pIdx = 0;
- sqlite3TableLock(pParse, iDb, pParent->tnum, 0, pParent->zName);
+ sqlite3TableLock(pParse, iTabDb, pParent->tnum, 0, pParent->zName);
x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, 0);
if( x==0 ){
if( pIdx==0 ){
- sqlite3OpenTable(pParse, i, iDb, pParent, OP_OpenRead);
+ sqlite3OpenTable(pParse, i, iTabDb, pParent, OP_OpenRead);
}else{
- sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iDb);
+ sqlite3VdbeAddOp3(v, OP_OpenRead, i, pIdx->tnum, iTabDb);
sqlite3VdbeSetP4KeyInfo(pParse, pIdx);
}
}else{
[db eval {EXPLAIN PRAGMA integrity_check}]
} {/ IntegrityCk 2 2 1 x[0-9]+,1x /}
+
+#--------------------------------------------------------------------------
+#
+reset_db
+forcedelete test.db2
+do_execsql_test 4.1.1 {
+ CREATE TABLE t1(a, b, c);
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE aux.t2(d, e, f);
+}
+do_execsql_test 4.1.2 { PRAGMA table_info = t1 } {
+ 0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0
+}
+do_execsql_test 4.1.3 { PRAGMA table_info = t2 } {
+ 0 d {} 0 {} 0 1 e {} 0 {} 0 2 f {} 0 {} 0
+}
+do_test 4.1.4 {
+ sqlite3 db3 test.db
+ sqlite3 db2 test.db2
+ execsql { DROP TABLE t1 } db3
+ execsql { DROP TABLE t2 } db2
+} {}
+do_execsql_test 4.1.5 { PRAGMA table_info = t1 }
+do_execsql_test 4.1.6 { PRAGMA table_info = t2 }
+
+db2 close
+db3 close
+reset_db
+forcedelete test.db2
+do_execsql_test 4.2.1 {
+ CREATE TABLE t1(a, b, c);
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE aux.t2(d, e, f);
+}
+do_execsql_test 4.2.2 { SELECT * FROM pragma_table_info('t1') } {
+ 0 a {} 0 {} 0 1 b {} 0 {} 0 2 c {} 0 {} 0
+}
+do_execsql_test 4.2.3 { SELECT * FROM pragma_table_info('t2') } {
+ 0 d {} 0 {} 0 1 e {} 0 {} 0 2 f {} 0 {} 0
+}
+do_test 4.2.4 {
+ sqlite3 db3 test.db
+ sqlite3 db2 test.db2
+ execsql { DROP TABLE t1 } db3
+ execsql { DROP TABLE t2 } db2
+} {}
+do_execsql_test 4.2.5 { SELECT * FROM pragma_table_info('t1') }
+do_execsql_test 4.2.6 { SELECT * FROM pragma_table_info('t2') }
+
+db2 close
+db3 close
+reset_db
+forcedelete test.db2
+do_execsql_test 4.3.1 {
+ CREATE TABLE t1(a, b, c);
+ CREATE INDEX i1 ON t1(b);
+ ATTACH 'test.db2' AS aux;
+ CREATE TABLE aux.t2(d, e, f);
+ CREATE INDEX aux.i2 ON t2(e);
+}
+do_execsql_test 4.3.2 { SELECT * FROM pragma_index_info('i1') } {0 1 b}
+do_execsql_test 4.3.3 { SELECT * FROM pragma_index_info('i2') } {0 1 e}
+do_test 4.3.4 {
+ sqlite3 db3 test.db
+ sqlite3 db2 test.db2
+ execsql { DROP INDEX i1 } db3
+ execsql { DROP INDEX i2 } db2
+} {}
+do_execsql_test 4.3.5 { SELECT * FROM pragma_index_info('i1') }
+do_execsql_test 4.3.6 { SELECT * FROM pragma_index_info('i2') }
+
+do_execsql_test 4.4.0 {
+ CREATE INDEX main.i1 ON t1(b, c);
+ CREATE INDEX aux.i2 ON t2(e, f);
+}
+do_execsql_test 4.4.1 { SELECT * FROM pragma_index_list('t1') } {0 i1 0 c 0}
+do_execsql_test 4.4.2 { SELECT * FROM pragma_index_list('t2') } {0 i2 0 c 0}
+do_test 4.4.3 {
+ execsql { DROP INDEX i1 } db3
+ execsql { DROP INDEX i2 } db2
+} {}
+do_execsql_test 4.4.5 { SELECT * FROM pragma_index_list('t1') } {}
+do_execsql_test 4.4.6 { SELECT * FROM pragma_index_list('t2') } {}
+
+do_execsql_test 4.5.0 {
+ CREATE UNIQUE INDEX main.i1 ON t1(a);
+ CREATE UNIQUE INDEX aux.i2 ON t2(d);
+ CREATE TABLE main.c1 (a, b, c REFERENCES t1(a));
+ CREATE TABLE aux.c2 (d, e, r REFERENCES t2(d));
+}
+do_execsql_test 4.5.1 { SELECT * FROM pragma_foreign_key_list('c1') } {
+ 0 0 t1 c a {NO ACTION} {NO ACTION} NONE
+}
+do_execsql_test 4.5.2 { SELECT * FROM pragma_foreign_key_list('c2') } {
+ 0 0 t2 r d {NO ACTION} {NO ACTION} NONE
+}
+do_test 4.5.3 {
+ execsql { DROP TABLE c1 } db3
+ execsql { DROP TABLE c2 } db2
+} {}
+do_execsql_test 4.5.1 { SELECT * FROM pragma_foreign_key_list('c1') }
+do_execsql_test 4.5.2 { SELECT * FROM pragma_foreign_key_list('c2') }
+
+do_execsql_test 4.6.0 {
+ CREATE TABLE main.c1 (a, b, c REFERENCES t1(a));
+ CREATE TABLE aux.c2 (d, e, r REFERENCES t2(d));
+ INSERT INTO main.c1 VALUES(1, 2, 3);
+ INSERT INTO aux.c2 VALUES(4, 5, 6);
+}
+do_execsql_test 4.6.1 { pragma foreign_key_check('c1') } {
+ c1 1 t1 0
+}
+do_execsql_test 4.6.2 { pragma foreign_key_check('c2') } {
+ c2 1 t2 0
+}
+do_test 4.6.3 {
+ execsql { DROP TABLE c2 } db2
+} {}
+do_execsql_test 4.6.4 { pragma foreign_key_check('c1') } {c1 1 t1 0}
+do_catchsql_test 4.6.5 {
+ pragma foreign_key_check('c2')
+} {1 {no such table: c2}}
+
finish_test
+