diff options
author | dan <Dan Kennedy> | 2025-04-10 16:48:04 +0000 |
---|---|---|
committer | dan <Dan Kennedy> | 2025-04-10 16:48:04 +0000 |
commit | da00cc101c208caeddfef8b1739d390a2bc60f8a (patch) | |
tree | 9b75f83ea1c73818d7a90934220228829adc3192 | |
parent | 08122e96fea0acf66d33b9f5e9650f6ebb841431 (diff) | |
download | sqlite-da00cc101c208caeddfef8b1739d390a2bc60f8a.tar.gz sqlite-da00cc101c208caeddfef8b1739d390a2bc60f8a.zip |
Improve the error messages returned by sqlite3session_diff().
FossilOrigin-Name: a3217cdb75fd305705856f6504f8816c2b6b0a10907725cb74d025a5c4e369b8
-rw-r--r-- | ext/session/sessionD.test | 42 | ||||
-rw-r--r-- | ext/session/sqlite3session.c | 40 | ||||
-rw-r--r-- | ext/session/sqlite3session.h | 5 | ||||
-rw-r--r-- | manifest | 17 | ||||
-rw-r--r-- | manifest.uuid | 2 |
5 files changed, 85 insertions, 21 deletions
diff --git a/ext/session/sessionD.test b/ext/session/sessionD.test index f60fbabc2..74bb101e3 100644 --- a/ext/session/sessionD.test +++ b/ext/session/sessionD.test @@ -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 diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 6c386f42e..d049f6986 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -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++){ diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index 919365b14..3405dd064 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -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 @@ -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. diff --git a/manifest.uuid b/manifest.uuid index 6e1f9e945..7e4dede23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -979f384a93d25e24f760469681618101feaab873738e1b52a7d4b818f7c527d9 +a3217cdb75fd305705856f6504f8816c2b6b0a10907725cb74d025a5c4e369b8 |