]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improve the error messages returned by sqlite3session_diff().
authordan <Dan Kennedy>
Thu, 10 Apr 2025 16:48:04 +0000 (16:48 +0000)
committerdan <Dan Kennedy>
Thu, 10 Apr 2025 16:48:04 +0000 (16:48 +0000)
FossilOrigin-Name: a3217cdb75fd305705856f6504f8816c2b6b0a10907725cb74d025a5c4e369b8

ext/session/sessionD.test
ext/session/sqlite3session.c
ext/session/sqlite3session.h
manifest
manifest.uuid

index f60fbabc2a5c3a04b6470e2abcd5ecf9df78b3f1..74bb101e31c65d784ea39f8429359a5472944bec 100644 (file)
@@ -202,7 +202,7 @@ do_test 4.3.1 {
   S attach t4
   execsql { CREATE TABLE t4(i PRIMARY KEY, b) }
   list [catch { S diff ixua t4 } msg] $msg
-} {1 {SQLITE_SCHEMA - table schemas do not match}}
+} {1 {SQLITE_SCHEMA - no such table: ixua.t4}}
 S delete
 do_catchsql_test 4.3.2 {
   SELECT * FROM ixua.t4;
@@ -214,7 +214,7 @@ do_test 4.4.1 {
   execsql { ANALYZE }
   execsql { DROP TABLE ixua.sqlite_stat1 }
   list [catch { S diff ixua sqlite_stat1 } msg] $msg
-} {1 {SQLITE_SCHEMA - table schemas do not match}}
+} {1 {SQLITE_SCHEMA - no such table: ixua.sqlite_stat1}}
 S delete
 do_catchsql_test 4.4.2 {
   SELECT * FROM ixua.sqlite_stat1;
@@ -258,4 +258,42 @@ do_changeset_test 4.2 S {
 
 S delete
 
+#-------------------------------------------------------------------------
+# Test that sqlite3session_diff() really does return errors if 
+#
+reset_db
+forcedelete test.db2
+do_execsql_test 5.0 {
+  ATTACH 'test.db2' AS two;
+  CREATE TABLE main.t1(a INTEGER PRIMARY KEY, b);
+  CREATE TABLE main.t2(a INTEGER PRIMARY KEY, b);
+  CREATE TABLE two.t1(a, b INTEGER PRIMARY KEY);
+}
+
+proc do_sessions_diff_error {tn db tbl err} {
+  sqlite3session S db main
+  set rc [catch {S diff $db $tbl} msg]
+
+  set ::sdgot [list $rc $msg]
+  do_test $tn [list set sdgot] [list {*}$err]
+
+  S delete
+}
+
+# Test that it is an error if the named db is missing.
+breakpoint
+do_sessions_diff_error 5.1 nosuchdb t1 {
+  1 {SQLITE_SCHEMA - no such table: nosuchdb.t1}
+}
+
+# Test that it is an error if the named db is present, but named table is not.
+do_sessions_diff_error 5.2 two t2 {
+  1 {SQLITE_SCHEMA - no such table: two.t2}
+}
+
+# Test that it is an error if the tables are present, but schemas do not match.
+do_sessions_diff_error 5.3 two t1 {
+  1 {SQLITE_SCHEMA - table schemas do not match}
+}
+
 finish_test
index 6c386f42e2006d129626d759db0c4e4243959b12..d049f69862c6f8004a007d5a964994c2c9d69003 100644 (file)
@@ -2229,17 +2229,43 @@ int sqlite3session_diff(
     if( rc==SQLITE_OK ){
       int bHasPk = 0;
       int bMismatch = 0;
-      int nCol;                   /* Columns in zFrom.zTbl */
+      int nCol = 0;               /* Columns in zFrom.zTbl */
       int bRowid = 0;
-      u8 *abPK;
+      u8 *abPK = 0;
       const char **azCol = 0;
-      rc = sessionTableInfo(0, db, zFrom, zTbl, 
-          &nCol, 0, 0, &azCol, 0, 0, &abPK, 
-          pSession->bImplicitPK ? &bRowid : 0
-      );
+      char *zDbExists = 0;
+
+      /* Check that database zFrom is attached.  */
+      zDbExists = sqlite3_mprintf("SELECT * FROM %Q.sqlite_schema", zFrom);
+      if( zDbExists==0 ){
+        rc = SQLITE_NOMEM;
+      }else{
+        sqlite3_stmt *pDbExists = 0;
+        rc = sqlite3_prepare_v2(db, zDbExists, -1, &pDbExists, 0);
+        if( rc==SQLITE_ERROR ){
+          rc = SQLITE_OK;
+          nCol = -1;
+        }
+        sqlite3_finalize(pDbExists);
+        sqlite3_free(zDbExists);
+      }
+
+      if( rc==SQLITE_OK && nCol==0 ){
+        rc = sessionTableInfo(0, db, zFrom, zTbl, 
+            &nCol, 0, 0, &azCol, 0, 0, &abPK, 
+            pSession->bImplicitPK ? &bRowid : 0
+        );
+      }
       if( rc==SQLITE_OK ){
         if( pTo->nCol!=nCol ){
-          bMismatch = 1;
+          if( nCol<=0 ){
+            rc = SQLITE_SCHEMA;
+            if( pzErrMsg ){
+              *pzErrMsg = sqlite3_mprintf("no such table: %s.%s", zFrom, zTbl);
+            }
+          }else{
+            bMismatch = 1;
+          }
         }else{
           int i;
           for(i=0; i<nCol; i++){
index 919365b14f7bc176e0f118add488c79cdb3bc5ff..3405dd064dbd3a19c522aac95559eddd0ac93240 100644 (file)
@@ -432,8 +432,9 @@ sqlite3_int64 sqlite3session_changeset_size(sqlite3_session *pSession);
 ** database zFrom the contents of the two compatible tables would be 
 ** identical.
 **
-** It an error if database zFrom does not exist or does not contain the
-** required compatible table.
+** Unless the call to this function is a no-op as described above, it is an
+** error if database zFrom does not exist or does not contain the required 
+** compatible table.
 **
 ** If the operation is successful, SQLITE_OK is returned. Otherwise, an SQLite
 ** error code. In this case, if argument pzErrMsg is not NULL, *pzErrMsg
index f20b0ce340c28e9573d6757ce567ce5b4c939fd8..7be17f10ecf03f18de938b82f885cf8d0b12651c 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sobscure\sproblem\sallowing\sthe\spropagate-constants\soptimization\sto\simproperly\ssubstitute\sa\scolumn\sof\sa\ssub-query\swith\sNONE\saffinity.\s[forum:/forumpost/0109bca824|Forum\spost\s2025-04-08T14:18:45Z].
-D 2025-04-10T15:01:58.329
+C Improve\sthe\serror\smessages\sreturned\sby\ssqlite3session_diff().
+D 2025-04-10T16:48:04.265
 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -589,7 +589,7 @@ F ext/session/session9.test 4e3aff62d6b4294498ddbe309076de06f4fddffad4fe5f5a6c03
 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f
 F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c
 F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf
-F ext/session/sessionD.test 9d5d1d07bfc2de8400cd8607297dcd405e2889ccae58ae17db054de5fcae37ab
+F ext/session/sessionD.test 06fa4c7548f0bb88df1be26c0da3a69caac7f49d1a282e7971aeeb4fa94cf803
 F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d
 F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401
 F ext/session/sessionG.test 3efe388282d641b65485b5462e67851002cd91a282dc95b685d085eb8efdad0a
@@ -617,8 +617,8 @@ F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a
 F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795
 F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec
 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc
-F ext/session/sqlite3session.c b0f44e89facdf03feacd040b18b6fb04a5cc55095be8b688f3cbb1412eeab993
-F ext/session/sqlite3session.h aa5de3ec8ef0e5313e9f65dafd69e8ba292d170f07b57da9200c040068dab061
+F ext/session/sqlite3session.c 1a28245b9814542c1b9c8f3064fc63a91b341833879b27246a0ea8cf10257069
+F ext/session/sqlite3session.h 532561f5b181bc623c25bfa0ecfd1f115bc9a2b42ec96fee8a67b1a10f3cc42c
 F ext/session/test_session.c af162108e8dc40cb9fe0e876e0155cecabcb49e82e5939677d21451e36160283
 F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c
 F ext/wasm/GNUmakefile 24d7e6f446528fa67f5ade6c3c7d7e46e1ac52649d6264cbe24539c1dab608e1
@@ -2216,9 +2216,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 20acd630b91609725794ce84f9eda01d5f3c898407f0948264830851d25ccaa6 d82725dcaec7437f37fc15dfb492b51a4f9dbbbcaea04e387d9471b7d291cde2
-R 47ed749e6cbdb9364e8a1ddc5a4d9530
-T +closed d82725dcaec7437f37fc15dfb492b51a4f9dbbbcaea04e387d9471b7d291cde2
+P 979f384a93d25e24f760469681618101feaab873738e1b52a7d4b818f7c527d9
+R 4b5c476eaf3c97d6673579173944e73c
 U dan
-Z 80a59eb3cd773167bd96b9d707b9d53d
+Z 8c83c1cee68bcdb1cf7731347bbc44c3
 # Remove this line to create a well-formed Fossil manifest.
index 6e1f9e945721e58e98752917b38693a159a3045d..7e4dede233635407d1c46fcc49e4999db3b6d1d8 100644 (file)
@@ -1 +1 @@
-979f384a93d25e24f760469681618101feaab873738e1b52a7d4b818f7c527d9
+a3217cdb75fd305705856f6504f8816c2b6b0a10907725cb74d025a5c4e369b8