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;
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;
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
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++){
** 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
-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
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
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
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.
-979f384a93d25e24f760469681618101feaab873738e1b52a7d4b818f7c527d9
+a3217cdb75fd305705856f6504f8816c2b6b0a10907725cb74d025a5c4e369b8