diff --git a/src/crypto.c b/src/crypto.c index 851b8d3..948e5aa 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -610,6 +610,7 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar int saved_flags; /* Saved value of the db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ + u8 saved_mTrace; /* Saved value of db->mTrace */ int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */ int rc = SQLITE_OK; /* Return code from service routines */ char *zSql = NULL; /* SQL statements */ @@ -619,9 +620,11 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; saved_xTrace = db->xTrace; + saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin; db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder); db->xTrace = 0; + db->mTrace = 0; /* Query the schema of the main database. Create a mirror schema ** in the temporary database. @@ -707,6 +710,7 @@ end_of_export: db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; db->xTrace = saved_xTrace; + db->mTrace = saved_mTrace; sqlite3_free(zSql); diff --git a/src/crypto_impl.c b/src/crypto_impl.c index e962ef0..71e42e8 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -1026,6 +1026,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) { int saved_flags; int saved_nChange; int saved_nTotalChange; + u8 saved_mTrace; int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */ Db *pDb = 0; sqlite3 *db = ctx->pBt->db; @@ -1130,9 +1131,11 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) { saved_nChange = db->nChange; saved_nTotalChange = db->nTotalChange; saved_xTrace = db->xTrace; + saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin; db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder); db->xTrace = 0; + db->mTrace = 0; pDest = db->aDb[0].pBt; pDb = &(db->aDb[db->nDb-1]); @@ -1164,6 +1167,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) { db->nChange = saved_nChange; db->nTotalChange = saved_nTotalChange; db->xTrace = saved_xTrace; + db->mTrace = saved_mTrace; db->autoCommit = 1; sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; diff --git a/test/crypto.test b/test/crypto.test index b25cdd6..353812d 100644 --- a/test/crypto.test +++ b/test/crypto.test @@ -103,6 +103,11 @@ proc cmpFilesChunked {file1 file2 {chunksize 16384}} { return 0 } +proc trace_proc sql { + global TRACE_OUT + lappend TRACE_OUT [string trim $sql] +} + # The database is initially empty. # set an hex key create some basic data # create table and insert operations should work @@ -2318,5 +2323,29 @@ if_built_with_openssl wont-write-database-with-invalid-cipher-2 { db close file delete -force test.db +do_test verify-cipher-export-with-trace-configured { + sqlite_orig db plain.db + execsql { + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES(1,2); + } + set TRACE_OUT {} + db trace trace_proc + set stmt [sqlite3_prepare db {ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} -1 TAIL] + sqlite3_step $stmt + sqlite3_finalize $stmt + set stmt [sqlite3_prepare db {SELECT sqlcipher_export('encrypted');} -1 TAIL] + sqlite3_step $stmt + sqlite3_finalize $stmt + set stmt [sqlite3_prepare db {DETACH DATABASE encrypted;} -1 TAIL] + sqlite3_step $stmt + sqlite3_finalize $stmt + set TRACE_OUT +} {{ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} {SELECT sqlcipher_export('encrypted');} {DETACH DATABASE encrypted;}} +set TRACE_OUT {} +db close +file delete -force plain.db +file delete -force encrypted.db + sqlite3_test_control_pending_byte $old_pending_byte finish_test