]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix problems in pragma.c causing some PRAGMA statements to test the wrong
authordan <dan@noemail.net>
Tue, 20 Nov 2018 18:09:59 +0000 (18:09 +0000)
committerdan <dan@noemail.net>
Tue, 20 Nov 2018 18:09:59 +0000 (18:09 +0000)
schema-cookie before proceeding, or to try to open cursors on the wrong
database ("PRAGMA foreign_key_check" only).

FossilOrigin-Name: 6982f52f579d20b8a2965373731d41622bda7f09fbf82cc005bb378321829f4c

manifest
manifest.uuid
src/pragma.c
test/pragma4.test

index 78f0598ca8f743a98f6613f721f484c240d32324..d1439c03fdde1ec0ac9870dae2ef0a22f6765995 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-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
@@ -499,7 +499,7 @@ F src/parse.y 6840fe7c0b5eb4dd25ee5d075213bc8255ed4c0678d71bfb6744d0520d91c179
 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
@@ -1183,7 +1183,7 @@ F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb0696
 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
@@ -1778,7 +1778,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 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
index 679f5bbd9909f38bd9cbbaeeaa86218a7982f490..2d5f684971dad7c794923af6dc9e3a201dff8813 100644 (file)
@@ -1 +1 @@
-1740025307531a52e4f0641e2e74dc14715130858f2e9236be13b66924f00220
\ No newline at end of file
+6982f52f579d20b8a2965373731d41622bda7f09fbf82cc005bb378321829f4c
\ No newline at end of file
index 20656dc4530b0cf2b2296459dcebfae6a218ddc4..54e219ba60750feebbc2286eeb2e8f323e1a1f2d 100644 (file)
@@ -1086,12 +1086,13 @@ void sqlite3Pragma(
     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);
@@ -1152,6 +1153,7 @@ void sqlite3Pragma(
     Table *pTab;
     pIdx = sqlite3FindIndex(db, zRight, zDb);
     if( pIdx ){
+      int iIdxDb = sqlite3SchemaToIndex(db, pIdx->pSchema);
       int i;
       int mx;
       if( pPragma->iArg ){
@@ -1164,7 +1166,7 @@ void sqlite3Pragma(
         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];
@@ -1188,8 +1190,9 @@ void sqlite3Pragma(
     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",
@@ -1277,9 +1280,10 @@ void sqlite3Pragma(
     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++){
@@ -1324,9 +1328,9 @@ void sqlite3Pragma(
     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;
@@ -1335,21 +1339,23 @@ void sqlite3Pragma(
         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{
index d3ded75443e8984c8ebaa77bb1ad1e14cbfe2a52..cff50cf19f21a3e3818a52f6fc573044c894af5d 100644 (file)
@@ -100,4 +100,128 @@ do_test pragma4-2.100 {
     [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
+