]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
If the SQLITE_FCNTL_PRAGMA file-control returns anything other than
authordrh <drh@noemail.net>
Wed, 22 Feb 2012 19:56:17 +0000 (19:56 +0000)
committerdrh <drh@noemail.net>
Wed, 22 Feb 2012 19:56:17 +0000 (19:56 +0000)
SQLTIE_NOTFOUND and SQLITE_OK, then treat the result as an error.

FossilOrigin-Name: 5643618108a8aafba67ed4004039b862bb5e5da8

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

index 3688bf37f2d5f53f31e3e29e871679157fd20e10..dddb378ea9a57eb99cc0de7aa6e7da66c9d6bcc8 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Disable\sthe\s"filename"\spragma\simplemented\sby\sos_unix.c\sexcept\swhen\scompiled\nwith\sSQLITE_TEST.
-D 2012-02-22T19:03:19.757
+C If\sthe\sSQLITE_FCNTL_PRAGMA\sfile-control\sreturns\sanything\sother\sthan\nSQLTIE_NOTFOUND\sand\sSQLITE_OK,\sthen\streat\sthe\sresult\sas\san\serror.
+D 2012-02-22T19:56:17.256
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 3f79a373e57c3b92dabf76f40b065e719d31ac34
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -174,7 +174,7 @@ F src/parse.y 1ddd71ae55f4b7cbb2672526ea4de023de0f519e
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
 F src/pcache.h 1b5dcc3dc8103d03e625b177023ee67764fa6b7c
 F src/pcache1.c b30b1c35908346ecc43d8d9d17f2ddf6817f8f60
-F src/pragma.c c452bbbd2afc48e80a42adaba559bd63e998ea17
+F src/pragma.c a6b1b209a143fd235fe61cad4bf4e0d1f765f5ce
 F src/prepare.c ec4989f7f480544bdc4192fe663470d2a2d7d61e
 F src/printf.c 7ffb4ebb8b341f67e049695ba031da717b3d2699
 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
@@ -230,7 +230,7 @@ F src/test_superlock.c 2b97936ca127d13962c3605dbc9a4ef269c424cd
 F src/test_syscall.c a992d8c80ea91fbf21fb2dd570db40e77dd7e6ae
 F src/test_tclvar.c f4dc67d5f780707210d6bb0eb6016a431c04c7fa
 F src/test_thread.c e286f2173563f2a1747c24bcda6b9d030bf4f4e4
-F src/test_vfs.c 07157a0bbfe161cb5e32cad2079abd26cd611c4b
+F src/test_vfs.c 37d523ce239e853a302933327ccbc8c73c4572c1
 F src/test_vfstrace.c f20a32a5fd46feb59a93d2cf650f1ff92da3872b
 F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290
 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
@@ -635,7 +635,7 @@ F test/pagesize.test 1dd51367e752e742f58e861e65ed7390603827a0
 F test/pcache.test 065aa286e722ab24f2e51792c1f093bf60656b16
 F test/pcache2.test a83efe2dec0d392f814bfc998def1d1833942025
 F test/permutations.test fa6f0e5f13fe0b1d3f7a7613179b7f7b20028184
-F test/pragma.test 7fa35e53085812dac94c2bfcbb02c2a4ad35df5e
+F test/pragma.test 01abcc2e43d080db8df0f9517233937c20892bd1
 F test/pragma2.test 3a55f82b954242c642f8342b17dffc8b47472947
 F test/printf.test ec9870c4dce8686a37818e0bf1aba6e6a1863552
 F test/progress.test 5b075c3c790c7b2a61419bc199db87aaf48b8301
@@ -990,7 +990,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P a1f29fa653b788f563967f55c3d20e64cbe3f549
-R 69256c5b535e2ca4839b991d3bdc0dd8
+P 9a1da91850b6074e5f9d18382f517eb868cad63c
+R 38bcf4842421c21898ae536d39030b7a
 U drh
-Z 24345afb75f6875260101e2916714082
+Z 347350cb546f31164cbf5b1b4da5c224
index fb3e3454928458a427e050b3d9ad21458a5d94d7..fb958af86368a9df85287d9935aabf71f52db6d1 100644 (file)
@@ -1 +1 @@
-9a1da91850b6074e5f9d18382f517eb868cad63c
\ No newline at end of file
+5643618108a8aafba67ed4004039b862bb5e5da8
\ No newline at end of file
index c5f4b285cda8c9342499dad607ef0e0fdae7aeab..7330e39d14e206ccb071413f4d2c6f9b4405ab66 100644 (file)
@@ -357,9 +357,7 @@ void sqlite3Pragma(
   aFcntl[1] = zLeft;
   aFcntl[2] = zRight;
   aFcntl[3] = 0;
-  sqlite3BeginBenignMalloc();
   rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl);
-  sqlite3EndBenignMalloc();
   if( rc==SQLITE_OK ){
     if( aFcntl[0] ){
       int mem = ++pParse->nMem;
@@ -369,7 +367,14 @@ void sqlite3Pragma(
       sqlite3VdbeAddOp2(v, OP_ResultRow, mem, 1);
       sqlite3_free(aFcntl[0]);
     }
-  }else
+  }else if( rc!=SQLITE_NOTFOUND ){
+    if( aFcntl[0] ){
+      sqlite3ErrorMsg(pParse, "%s", aFcntl[0]);
+      sqlite3_free(aFcntl[0]);
+    }
+    pParse->nErr++;
+    pParse->rc = rc;
+  }
                             
  
 #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
index a79407b57f0280f4d978759cb994de153f569de3..c18d0f6daed4333c21356f6588febb84d0c68592 100644 (file)
@@ -480,6 +480,23 @@ static int tvfsCheckReservedLock(sqlite3_file *pFile, int *pResOut){
 */
 static int tvfsFileControl(sqlite3_file *pFile, int op, void *pArg){
   TestvfsFd *p = tvfsGetFd(pFile);
+  if( op==SQLITE_FCNTL_PRAGMA ){
+    char **argv = (char**)pArg;
+    if( sqlite3_stricmp(argv[1],"error")==0 ){
+      int rc = SQLITE_ERROR;
+      if( argv[2] ){
+        const char *z = argv[2];
+        int x = atoi(z);
+        if( x ){
+          rc = x;
+          while( sqlite3Isdigit(z[0]) ){ z++; }
+          while( sqlite3Isspace(z[0]) ){ z++; }
+        }
+        if( z[0] ) argv[0] = sqlite3_mprintf("%s", z);
+      }
+      return rc;
+    }
+  }
   return sqlite3OsFileControl(p->pReal, op, pArg);
 }
 
index cbe35ea806f5388a49b0b91400bb7f94dd1d72b0..fb1034f10af76f99148860efe39e6929bed31e78 100644 (file)
@@ -1489,4 +1489,23 @@ foreach {temp_setting val} {
   } $val
 }
 
+# The SQLITE_FCNTL_PRAGMA logic, with error handling.
+#
+db close
+testvfs tvfs
+sqlite3 db test.db -vfs tvfs
+do_test pragma-19.1 {
+  catchsql {PRAGMA error}
+} {1 {SQL logic error or missing database}}
+do_test pragma-19.2 {
+  catchsql {PRAGMA error='This is the error message'}
+} {1 {This is the error message}}
+do_test pragma-19.3 {
+  catchsql {PRAGMA error='7 This is the error message'}
+} {1 {This is the error message}}
+do_test pragma-19.4 {
+  catchsql {PRAGMA error=7}
+} {1 {out of memory}}
+
+
 finish_test