]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Have the shell tool automatically enable SQLITE_CONFIG_DQS_DDL when executing a ...
authordan <Dan Kennedy>
Fri, 12 Jan 2024 11:44:49 +0000 (11:44 +0000)
committerdan <Dan Kennedy>
Fri, 12 Jan 2024 11:44:49 +0000 (11:44 +0000)
FossilOrigin-Name: f47a5f4e0ce078e6cc1183e6cbb3c4013af379b496efae94863a42e5c39928ed

manifest
manifest.uuid
src/shell.c.in
test/shell4.test
test/shell9.test
test/tester.tcl

index 9b094c6b3503ed5db2c921166526e98aedce431d..8c862e2c0c122ad920de679bd5770d394d88bffe 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\scomment\sin\ssessions.\s\sNo\sfunctional\schanges.\n[forum:/forumpost/8c20dc935b|Forum\spost\s8c20dc935b].
-D 2024-01-11T14:13:17.382
+C Have\sthe\sshell\stool\sautomatically\senable\sSQLITE_CONFIG_DQS_DDL\swhen\sexecuting\sa\s".dump"\sscript\sagainst\san\sempty\sdb.
+D 2024-01-12T11:44:49.861
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -738,7 +738,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c e25f51a473a5f30a0d978e4df2aaa98aeec84eac29ecae1ad4708a6c3e669345
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c f1a81ff4f8e9e76c224e2ab3a4baa799add0db22158c7fcede65d8cc4a6fa2da
-F src/shell.c.in 3d19abd924ed1cec9c9908d5a10cb1580b8ca30df24c26bfe80efa0c00f664d8
+F src/shell.c.in d1ed426aae2d547932971e8019939cacb4dfda8258e45b8924b250e488e2d53d
 F src/sqlite.h.in 61a60b4ea04db8ead15e1579b20b64cb56e9f55d52c5f9f9694de630110593a3
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
@@ -1583,12 +1583,12 @@ F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304
 F test/shell1.test c7127a5e780ffc9e14c476773127fdf292c6db226529c44c1676f37b3793123f
 F test/shell2.test 35226c070a8c7f64fd016dfac2a0db2a40f709b3131f61daacd9dad61536c9cb
 F test/shell3.test 91febeac0412812bf6370abb8ed72700e32bf8f9878849414518f662dfd55e8a
-F test/shell4.test 9abd0c12a7e20a4c49e84d5be208d2124fa6c09e728f56f1f4bee0f02853935f
+F test/shell4.test 947029e5a9efae9054d424b309fc0311439c0c3a0866ebfa3b8a771120708220
 F test/shell5.test c8b6c54f26ec537f8558273d7ed293ca3725ef42e6b12b8f151718628bd1473b
 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3
 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f
 F test/shell8.test 3fd093d481aaa94dc77fb73f1044c1f19c7efe3477a395cc4f7450133bc54915
-F test/shell9.test fe41f890a89f57bdde7351d7a828a1d4b503ebe239d413137369f20faf7f8865
+F test/shell9.test f457a96c088344908e0518dbabffd02eda8ac2a8733f278679e5f47c103efbab
 F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5
 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3
 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5
@@ -1666,7 +1666,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30
 F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d1631311a16
 F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637
 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc
-F test/tester.tcl 6f6e53981b4bdd42ef088f52e23236bc1ba0ca41ed395cbd7f33cbcff7d74d3c
+F test/tester.tcl fe617b88c7eb08bdf983d2aaa31c20fbf439eee7b8e0d61ca636fcd0c305bbbf
 F test/testrunner.tcl 8e2a5c7550b78d3283eee6103104ae2bcf56aa1df892dbd1608f27b93ebf4de8
 F test/testrunner_data.tcl 7ffd951527bbc614e723fd8d123b6834321878530696adecfdf6035100bac64e
 F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899
@@ -2157,8 +2157,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P ccf552319a62bfb329820a3bc1f490bacbaa6e90694a257fc65a568a605542c3
-R e84faaffaa9b0edb5d8970e83a2a63a0
-U drh
-Z e07a25d21af32a3184818d2053f19bcc
+P b0eb6d3628c1f70399a22d9fd3b79a796bc343adfeba50515440db609565961a
+R ab5a4296dc153e787688d4ab18626d94
+U dan
+Z 9795dc3f51dc5999429a02089c48c9c6
 # Remove this line to create a well-formed Fossil manifest.
index 0e8cd62fe17df6c8adb1cec26197e719feff8489..eaba41901e075c611fa0570555061f14110b5569 100644 (file)
@@ -1 +1 @@
-b0eb6d3628c1f70399a22d9fd3b79a796bc343adfeba50515440db609565961a
\ No newline at end of file
+f47a5f4e0ce078e6cc1183e6cbb3c4013af379b496efae94863a42e5c39928ed
\ No newline at end of file
index 19574dc79c9566f7dc863a6bce87299c84dbbef2..da3b9f8706568e07049136394fb14550c29bd572 100644 (file)
@@ -11424,61 +11424,69 @@ static int line_is_complete(char *zSql, int nSql){
 **
 **    0: Have not seen any SQL.
 **    1: Have seen "PRAGMA foreign_keys=OFF;".
-**    2: Currently assuming we are parsing ".dump" restore, defensive mode
-**       should be disabled following the current transaction.
-**    3: Nothing left to do.
+**    2-6: Currently running .dump transaction. If the "2" bit is set,
+**         disable DEFENSIVE when done. If "4" is set, disable DQS_DDL.
+**    7: Nothing left to do. This function becomes a no-op.
 */
 static int doAutoDetectRestore(ShellState *p, const char *zSql){
   int rc = SQLITE_OK;
 
-  switch( p->eRestoreState ){
-    case 0: {
-      int bDefense = 0;           /* True if in defensive mode */ 
-      const char *zExpect = "PRAGMA foreign_keys=OFF;";
-      assert( strlen(zExpect)==24 );
-      sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
-      if( p->bSafeMode==0 && bDefense && memcmp(zSql, zExpect, 25)==0 ){
-        p->eRestoreState = 1;
-      }else{
-        p->eRestoreState = 3;
-      }
-      break;
-    };
-
-    case 1: {
-      const char *zExpect = "BEGIN TRANSACTION;";
-      assert( strlen(zExpect)==18 );
-      if( memcmp(zSql, zExpect, 19)==0 ){
-        /* Now check if the database is empty. */
-        const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
-        sqlite3_stmt *pStmt = 0;
-        int bEmpty = 1;
-
-        shellPrepare(p->db, &rc, zQuery, &pStmt);
-        if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
-          bEmpty = 0;
+  if( p->eRestoreState<7 ){
+    switch( p->eRestoreState ){
+      case 0: {
+        const char *zExpect = "PRAGMA foreign_keys=OFF;";
+        assert( strlen(zExpect)==24 );
+        if( p->bSafeMode==0 && memcmp(zSql, zExpect, 25)==0 ){
+          p->eRestoreState = 1;
+        }else{
+          p->eRestoreState = 7;
         }
-        shellFinalize(&rc, pStmt);
-        if( bEmpty && rc==SQLITE_OK ){
+        break;
+      };
+  
+      case 1: {
+        int bIsDump = 0;
+        const char *zExpect = "BEGIN TRANSACTION;";
+        assert( strlen(zExpect)==18 );
+        if( memcmp(zSql, zExpect, 19)==0 ){
+          /* Now check if the database is empty. */
+          const char *zQuery = "SELECT 1 FROM sqlite_schema LIMIT 1";
+          sqlite3_stmt *pStmt = 0;
+  
+          bIsDump = 1;
+          shellPrepare(p->db, &rc, zQuery, &pStmt);
+          if( rc==SQLITE_OK && sqlite3_step(pStmt)==SQLITE_ROW ){
+            bIsDump = 0;
+          }
+          shellFinalize(&rc, pStmt);
+        }
+        if( bIsDump && rc==SQLITE_OK ){
+          int bDefense = 0;
+          int bDqsDdl = 0;
+          sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, -1, &bDefense);
+          sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, -1, &bDqsDdl);
           sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
+          sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 1, 0);
+          p->eRestoreState = (bDefense ? 2 : 0) + (bDqsDdl ? 4 : 0);
         }else{
-          p->eRestoreState = 3;
+          p->eRestoreState = 7;
         }
+        break;
       }
-      break;
-    }
-
-    case 2: {
-      if( sqlite3_get_autocommit(p->db) ){
-        sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 0, 0);
-        p->eRestoreState = 3;
+  
+      default: {
+        if( sqlite3_get_autocommit(p->db) ){
+          if( (p->eRestoreState & 2) ){
+            sqlite3_db_config(p->db, SQLITE_DBCONFIG_DEFENSIVE, 1, 0);
+          }
+          if( (p->eRestoreState & 4) ){
+            sqlite3_db_config(p->db, SQLITE_DBCONFIG_DQS_DDL, 0, 0);
+          }
+          p->eRestoreState = 7;
+        }
+        break;
       }
-      break;
     }
-
-    default: /* Nothing to do */
-      assert( p->eRestoreState==3 );
-      break;
   }
 
   return rc;
index 193dc8b69b842afdd4f49522014e9b3d361e5f78..eee59b02b8116fa9070facdc525d3566b7686324 100644 (file)
@@ -117,7 +117,7 @@ do_test shell4-2.2 {
 } {0 {}}
 do_test shell4-2.3 {
   catchcmd ":memory:" ".trace stdout\n.dump\n.trace off\n"
-} {/^0 {PRAGMA.*}$/}
+} {/^0 {SELECT.*}$/}
 do_test shell4-2.4 {
   catchcmd ":memory:" ".trace stdout\nCREATE TABLE t1(x);SELECT * FROM t1;"
 } {0 {CREATE TABLE t1(x);
index d7759551f4ad99b2af1230f620ea4c25813cc1e6..34c9d8c5d6d01ce7d851ec7aab310d5d1acf8c46 100644 (file)
@@ -13,6 +13,9 @@
 # testing that it is possible to run a ".dump" script that creates
 # virtual tables without explicitly disabling defensive mode.
 #
+# And, that it can process a ".dump" script that contains strings
+# delimited using double-quotes in the schema (DQS_DDL setting).
+#
 
 # Test plan:
 #
@@ -124,4 +127,22 @@ do_test 2.2.2 {
   contains_warning [catchcmd test.db ".dump r1"]
 } 1
 
+#-------------------------------------------------------------------------
+reset_db
+sqlite3_db_config db DQS_DDL 1
+do_execsql_test 3.1.0 {
+  CREATE TABLE t4(hello, check( hello IS NOT "xyz") );
+}
+db close
+
+# Create .dump file in "testdump.txt".
+#
+set out [open testdump.txt w]
+puts $out [lindex [catchcmd test.db .dump] 1]
+close $out
+do_test 3.1.1 {
+  forcedelete test.db
+  catchcmd test.db ".read testdump.txt"
+} {0 {}}
+
 finish_test
index 5754d7037edc57971f72877db428f3cdfc67165c..b96bc505d8cbae1546f4d7ef2a0371a3e413189a 100644 (file)
@@ -554,7 +554,7 @@ if {[info exists cmdlinearg]==0} {
   }
   unset -nocomplain a
   set testdir [file normalize $testdir]
-  set cmdlinearg(TESTFIXTURE_HOME) [pwd]
+  set cmdlinearg(TESTFIXTURE_HOME) [file dirname [info nameofexec]]
   set cmdlinearg(INFO_SCRIPT) [file normalize [info script]]
   set argv0 [file normalize $argv0]
   if {$cmdlinearg(testdir)!=""} {