1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Improved error messages for the SQLITE_CONSTRAINT_DATATYPE error.

FossilOrigin-Name: 39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21
This commit is contained in:
drh
2021-08-20 08:05:42 +00:00
parent 7b4b74acc7
commit faf9c77b4b
4 changed files with 37 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
C Do\snot\sallow\sthe\sxfer-optimization\sto\smove\sthe\scontent\sof\san\sordinary\ntable\sinto\sa\sstrict\stable. C Improved\serror\smessages\sfor\sthe\sSQLITE_CONSTRAINT_DATATYPE\serror.
D 2021-08-20T01:12:39.171 D 2021-08-20T08:05:42.509
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -616,7 +616,7 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e F src/util.c eafc8cfeb66fdbf8839922d13019b7882f242ac31b383e3451aab7744c54df3e
F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45 F src/vacuum.c 454973a59fb20bb982efc2df568a098616db6328a0491b6e84e2e07f7333db45
F src/vdbe.c d2e395271e57203b1b929bfaa8ea8d8305fcf12c1d251954adee9bd492272060 F src/vdbe.c bf2d58ee9d12767e3aca7c29fe8c10eeea1844d5b16865d280743aee54d8c86d
F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe F src/vdbe.h 25dabb25c7e157b84e59260cfb5b466c3ac103ede9f36f4db371332c47601abe
F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b F src/vdbeInt.h 38206c8dd6b60ff03d9fd4f626b1b4fd0eef7cdc44f2fc2c1973b0f932a3f26b
F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5 F src/vdbeapi.c aa5aaf2c37676b83af5724c6cd8207a3064ed46a217fd180957f75ac84f7a2a5
@@ -1425,7 +1425,7 @@ F test/stat.test 15a3106eddedfc882f64bc09f237b4169be4b92dd57c93031b8ff8b13af3e7c
F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1
F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75
F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5
F test/strict1.test dab7a84f5445e696beb3e2eedda9b3a28fb16bf3092be1917b3f1a6163916197 F test/strict1.test 314971e166395f8d736d9ecd25c75565e6aac103f9346018c1f78df602e6e2d0
F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c F test/strict2.test fe1928b3768f51b39774d753ac7e71727718d1c3305eead0e5ea60f75e9e6b4c
F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49
F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f
@@ -1922,7 +1922,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 4ee57fb588b41ab76649c605f57c7bcf5b7b638435af458d69f69a8ccbb121e8 P 1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2
R 7461fae7c9e91c53b266760ec73eefb6 R 1becdbd72e9bc3a6d98c91082fba4b52
U drh U drh
Z f75e39c2709cda22cb0c40b7515a051c Z c26092e6de7efa8875b0da24f3b94164

View File

@@ -1 +1 @@
1ed1b594d3c03ced68eb2b1285dfd8b9641cda20db1b1b7ae1afee217a3a9fe2 39abca01479c0f4f747b7b21fa05181896b00ed7559f0ab74aa575c23097ac21

View File

@@ -671,6 +671,19 @@ static Mem *out2Prerelease(Vdbe *p, VdbeOp *pOp){
} }
} }
/*
** Return the symbolic name for the data type of a pMem
*/
static const char *vdbeMemTypeName(Mem *pMem){
static const char *azTypes[] = {
/* SQLITE_INTEGER */ "INT",
/* SQLITE_FLOAT */ "REAL",
/* SQLITE_TEXT */ "TEXT",
/* SQLITE_BLOB */ "BLOB",
/* SQLITE_NULL */ "NULL"
};
return azTypes[sqlite3_value_type(pMem)-1];
}
/* /*
** Execute as much of a VDBE program as we can. ** Execute as much of a VDBE program as we can.
@@ -2970,8 +2983,9 @@ case OP_TypeCheck: {
break; break;
vdbe_type_error: vdbe_type_error:
sqlite3VdbeError(p, "%s.%s holds only %s values", sqlite3VdbeError(p, "cannot store %s value in %s column %s.%s",
pTab->zName, aCol[i].zCnName, sqlite3StdType[aCol[i].eCType-1]); vdbeMemTypeName(pIn1), sqlite3StdType[aCol[i].eCType-1],
pTab->zName, aCol[i].zCnName);
rc = SQLITE_CONSTRAINT_DATATYPE; rc = SQLITE_CONSTRAINT_DATATYPE;
goto abort_due_to_error; goto abort_due_to_error;
} }

View File

@@ -49,19 +49,19 @@ do_execsql_test strict1-2.0 {
} {} } {}
do_catchsql_test strict1-2.1 { do_catchsql_test strict1-2.1 {
INSERT INTO t1(a) VALUES('xyz'); INSERT INTO t1(a) VALUES('xyz');
} {1 {t1.a holds only INT values}} } {1 {cannot store TEXT value in INT column t1.a}}
do_catchsql_test strict1-2.2 { do_catchsql_test strict1-2.2 {
INSERT INTO t1(b) VALUES('xyz'); INSERT INTO t1(b) VALUES('xyz');
} {1 {t1.b holds only INTEGER values}} } {1 {cannot store TEXT value in INTEGER column t1.b}}
do_catchsql_test strict1-2.3 { do_catchsql_test strict1-2.3 {
INSERT INTO t1(c) VALUES('xyz'); INSERT INTO t1(c) VALUES('xyz');
} {1 {t1.c holds only BLOB values}} } {1 {cannot store TEXT value in BLOB column t1.c}}
do_catchsql_test strict1-2.4 { do_catchsql_test strict1-2.4 {
INSERT INTO t1(d) VALUES(x'3142536475'); INSERT INTO t1(d) VALUES(x'3142536475');
} {1 {t1.d holds only TEXT values}} } {1 {cannot store BLOB value in TEXT column t1.d}}
do_catchsql_test strict1-2.5 { do_catchsql_test strict1-2.5 {
INSERT INTO t1(e) VALUES('xyz'); INSERT INTO t1(e) VALUES('xyz');
} {1 {t1.e holds only REAL values}} } {1 {cannot store TEXT value in REAL column t1.e}}
do_execsql_test strict1-3.1 { do_execsql_test strict1-3.1 {
INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null); INSERT INTO t1(a, b) VALUES(1,2),('3','4'),(5.0, 6.0),(null,null);
@@ -69,16 +69,16 @@ do_execsql_test strict1-3.1 {
} {1 2 | 3 4 | 5 6 | {} {} |} } {1 2 | 3 4 | 5 6 | {} {} |}
do_catchsql_test strict1-3.2 { do_catchsql_test strict1-3.2 {
INSERT INTO t1(a) VALUES(1.2); INSERT INTO t1(a) VALUES(1.2);
} {1 {t1.a holds only INT values}} } {1 {cannot store REAL value in INT column t1.a}}
do_catchsql_test strict1-3.3 { do_catchsql_test strict1-3.3 {
INSERT INTO t1(a) VALUES(x'313233'); INSERT INTO t1(a) VALUES(x'313233');
} {1 {t1.a holds only INT values}} } {1 {cannot store BLOB value in INT column t1.a}}
do_catchsql_test strict1-3.4 { do_catchsql_test strict1-3.4 {
INSERT INTO t1(b) VALUES(1.2); INSERT INTO t1(b) VALUES(1.2);
} {1 {t1.b holds only INTEGER values}} } {1 {cannot store REAL value in INTEGER column t1.b}}
do_catchsql_test strict1-3.5 { do_catchsql_test strict1-3.5 {
INSERT INTO t1(b) VALUES(x'313233'); INSERT INTO t1(b) VALUES(x'313233');
} {1 {t1.b holds only INTEGER values}} } {1 {cannot store BLOB value in INTEGER column t1.b}}
do_execsql_test strict1-4.1 { do_execsql_test strict1-4.1 {
DELETE FROM t1; DELETE FROM t1;
@@ -87,7 +87,7 @@ do_execsql_test strict1-4.1 {
} {blob 123 null {}} } {blob 123 null {}}
do_catchsql_test strict1-4.2 { do_catchsql_test strict1-4.2 {
INSERT INTO t1(c) VALUES('456'); INSERT INTO t1(c) VALUES('456');
} {1 {t1.c holds only BLOB values}} } {1 {cannot store TEXT value in BLOB column t1.c}}
do_execsql_test strict1-5.1 { do_execsql_test strict1-5.1 {
DELETE FROM t1; DELETE FROM t1;
@@ -96,7 +96,7 @@ do_execsql_test strict1-5.1 {
} {text xyz text 4 text 5.5 null {}} } {text xyz text 4 text 5.5 null {}}
do_catchsql_test strict1-5.2 { do_catchsql_test strict1-5.2 {
INSERT INTO t1(d) VALUES(x'4567'); INSERT INTO t1(d) VALUES(x'4567');
} {1 {t1.d holds only TEXT values}} } {1 {cannot store BLOB value in TEXT column t1.d}}
do_execsql_test strict1-6.1 { do_execsql_test strict1-6.1 {
DELETE FROM t1; DELETE FROM t1;
@@ -105,9 +105,9 @@ do_execsql_test strict1-6.1 {
} {real 1.0 real 2.5 real 3.0 real 4.5 real 6.0 null {}} } {real 1.0 real 2.5 real 3.0 real 4.5 real 6.0 null {}}
do_catchsql_test strict1-6.2 { do_catchsql_test strict1-6.2 {
INSERT INTO t1(e) VALUES('xyz'); INSERT INTO t1(e) VALUES('xyz');
} {1 {t1.e holds only REAL values}} } {1 {cannot store TEXT value in REAL column t1.e}}
do_catchsql_test strict1-6.3 { do_catchsql_test strict1-6.3 {
INSERT INTO t1(e) VALUES(x'3456'); INSERT INTO t1(e) VALUES(x'3456');
} {1 {t1.e holds only REAL values}} } {1 {cannot store BLOB value in REAL column t1.e}}
finish_test finish_test