aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2012-02-22 14:45:19 +0000
committerdrh <drh@noemail.net>2012-02-22 14:45:19 +0000
commit06fd5d63a4c562ac8a8bdf6119182f4d315e3248 (patch)
tree053712d7a7d28d899b9d3992d1dba1f5bb525a5d
parentcebeee5dcb74262efff4c4f608aa08a2835bdcb9 (diff)
downloadsqlite-06fd5d63a4c562ac8a8bdf6119182f4d315e3248.tar.gz
sqlite-06fd5d63a4c562ac8a8bdf6119182f4d315e3248.zip
Begin adding support for SQLITE_FCNTL_PRAGMA.
FossilOrigin-Name: 5be07904baf6e5b8b99ca6f4bb6ddec973e59cd4
-rw-r--r--manifest19
-rw-r--r--manifest.uuid2
-rw-r--r--src/pragma.c22
-rw-r--r--src/sqlite.h.in10
-rw-r--r--src/test_vfstrace.c6
5 files changed, 47 insertions, 12 deletions
diff --git a/manifest b/manifest
index 42136690f..a4bb376dd 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\sredefining\sNDEBUG\sif\sthe\sfuzzer\sis\sincluded\sin\san\samalagmated\ssource\sfile.
-D 2012-02-21T18:35:42.365
+C Begin\sadding\ssupport\sfor\sSQLITE_FCNTL_PRAGMA.
+D 2012-02-22T14:45:19.357
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 350f59843f4ec4fca5dc63d497caf6433096bbdd
+F src/pragma.c 4dfd5b263d459559cbecb877dc5f1e0fc822cc04
F src/prepare.c ec4989f7f480544bdc4192fe663470d2a2d7d61e
F src/printf.c 7ffb4ebb8b341f67e049695ba031da717b3d2699
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
@@ -182,7 +182,7 @@ F src/resolve.c 3d3e80a98f203ac6b9329e9621e29eda85ddfd40
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
F src/select.c 232283a2e60d91cbd9a5ddf2f6f7ecf53d590075
F src/shell.c aa28f117033ba3e44b5eaaf2ad572222bcdfd66e
-F src/sqlite.h.in 4f3230be44e084a1e98f91bb031b922f33dcf3f8
+F src/sqlite.h.in d51a37c14123717dec954c848f51fd635620ba00
F src/sqlite3ext.h 6904f4aadf976f95241311fbffb00823075d9477
F src/sqliteInt.h ea24b5f2d2e3ae7e0c1126a78c0e025ed4e98f4b
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
@@ -231,7 +231,7 @@ 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_vfstrace.c 065c7270a614254b2c68fbc7ba8d1fb1d5cbc823
+F src/test_vfstrace.c 374f6807d76e4899f51315469471b85db2703c2a
F src/test_wholenumber.c 6129adfbe7c7444f2e60cc785927f3aa74e12290
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/tokenize.c 1e86210d3976717a19238ea7b047fac481fe8c12
@@ -990,7 +990,10 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 969095ca3067d60f4d3a0a4ad419541cb8b146db
-R 6f6307ffcfea232f8dcb8699efa50953
+P f8ac826f95ae6b7b981e4765d2e65b6839d0eff9
+R f3e55ac02da0d4d13eff7250cbdd55d7
+T *branch * file-control-pragma
+T *sym-file-control-pragma *
+T -sym-trunk *
U drh
-Z 053a16dcdcfeef74bca7f647480c806f
+Z afe420533dd0a9b4e47e7db76c26bdaa
diff --git a/manifest.uuid b/manifest.uuid
index 85599c25d..fcbf89b7a 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-f8ac826f95ae6b7b981e4765d2e65b6839d0eff9 \ No newline at end of file
+5be07904baf6e5b8b99ca6f4bb6ddec973e59cd4 \ No newline at end of file
diff --git a/src/pragma.c b/src/pragma.c
index 187f9afe7..e449baa8f 100644
--- a/src/pragma.c
+++ b/src/pragma.c
@@ -312,9 +312,12 @@ void sqlite3Pragma(
const char *zDb = 0; /* The database name */
Token *pId; /* Pointer to <id> token */
int iDb; /* Database index for <database> */
- sqlite3 *db = pParse->db;
- Db *pDb;
- Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db);
+ const char *aFcntl[3]; /* Argument to SQLITE_FCNTL_PRAGMA */
+ int rc; /* return value form SQLITE_FCNTL_PRAGMA */
+ sqlite3 *db = pParse->db; /* The database connection */
+ Db *pDb; /* The specific database being pragmaed */
+ Vdbe *v = pParse->pVdbe = sqlite3VdbeCreate(db); /* Prepared statement */
+
if( v==0 ) return;
sqlite3VdbeRunOnlyOnce(v);
pParse->nMem = 2;
@@ -345,6 +348,19 @@ void sqlite3Pragma(
if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, zDb) ){
goto pragma_out;
}
+
+ /* Send an SQLITE_FCNTL_PRAGMA file-control to the underlying VFS
+ ** connection. If it returns SQLITE_OK, then assume that the VFS
+ ** handled the pragma and generate a no-op prepared statement.
+ */
+ aFcntl[0] = zLeft;
+ aFcntl[1] = zRight;
+ aFcntl[2] = 0;
+ rc = sqlite3_file_control(db, zDb, SQLITE_FCNTL_PRAGMA, (void*)aFcntl);
+ if( rc==SQLITE_OK ){
+ zLeft = "";
+ }
+
#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED)
/*
diff --git a/src/sqlite.h.in b/src/sqlite.h.in
index 6d2173d61..1bd1b0868 100644
--- a/src/sqlite.h.in
+++ b/src/sqlite.h.in
@@ -797,6 +797,15 @@ struct sqlite3_io_methods {
** do anything. Callers should initialize the char* variable to a NULL
** pointer in case this file-control is not implemented. This file-control
** is intended for diagnostic use only.
+**
+** ^Whenever a [PRAGMA] statement is parsed, an [SQLITE_FCNTL_PRAGMA]
+** file control is sent to the open [sqlite3_file] object corresponding
+** to the database file to which the pragma statement refers. ^If the
+** [SQLITE_FCNTL_PRAGMA] file control returns [SQLITE_NOTFOUND], then normal
+** [PRAGMA] processing continues. ^However, if the [SQLITE_FCNTL_PRAGMA]
+** file control returns [SQLITE_OK], then the parser assumes that the
+** VFS has handled the pragma itself and the parser generates a no-op
+** prepared statement.
*/
#define SQLITE_FCNTL_LOCKSTATE 1
#define SQLITE_GET_LOCKPROXYFILE 2
@@ -811,6 +820,7 @@ struct sqlite3_io_methods {
#define SQLITE_FCNTL_OVERWRITE 11
#define SQLITE_FCNTL_VFSNAME 12
#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13
+#define SQLITE_FCNTL_PRAGMA 14
/*
** CAPI3REF: Mutex Handle
diff --git a/src/test_vfstrace.c b/src/test_vfstrace.c
index 62577207b..a1fa6ff44 100644
--- a/src/test_vfstrace.c
+++ b/src/test_vfstrace.c
@@ -476,6 +476,12 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){
case SQLITE_FCNTL_OVERWRITE: zOp = "OVERWRITE"; break;
case SQLITE_FCNTL_VFSNAME: zOp = "VFSNAME"; break;
case 0xca093fa0: zOp = "DB_UNCHANGED"; break;
+ case SQLITE_FCNTL_PRAGMA: {
+ const char *const* a = (const char*const*)pArg;
+ sqlite3_snprintf(sizeof(zBuf), zBuf, "PRAGMA,[%s,%s]",a[0],a[1]);
+ zOp = zBuf;
+ break;
+ }
default: {
sqlite3_snprintf(sizeof zBuf, zBuf, "%d", op);
zOp = zBuf;