From: <ale...@us...> - 2012-06-06 11:06:40
|
Revision: 54611 http://firebird.svn.sourceforge.net/firebird/?rev=54611&view=rev Author: alexpeshkoff Date: 2012-06-06 11:06:31 +0000 (Wed, 06 Jun 2012) Log Message: ----------- Implemented CORE-3594: Include expected and actual string length into error message Modified Paths: -------------- firebird/trunk/lang_helpers/gds_codes.ftn firebird/trunk/lang_helpers/gds_codes.pas firebird/trunk/src/common/CharSet.cpp firebird/trunk/src/common/CharSet.h firebird/trunk/src/common/CsConvert.h firebird/trunk/src/common/cvt.cpp firebird/trunk/src/include/gen/codetext.h firebird/trunk/src/include/gen/iberror.h firebird/trunk/src/include/gen/msgs.h firebird/trunk/src/include/gen/sql_code.h firebird/trunk/src/include/gen/sql_state.h firebird/trunk/src/jrd/cvt.cpp firebird/trunk/src/jrd/intl.cpp firebird/trunk/src/jrd/intl_proto.h firebird/trunk/src/msgs/facilities2.sql firebird/trunk/src/msgs/messages2.sql firebird/trunk/src/msgs/system_errors2.sql Modified: firebird/trunk/lang_helpers/gds_codes.ftn =================================================================== --- firebird/trunk/lang_helpers/gds_codes.ftn 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/lang_helpers/gds_codes.ftn 2012-06-06 11:06:31 UTC (rev 54611) @@ -1476,6 +1476,8 @@ PARAMETER (GDS__libtommath_generic = 335545031) INTEGER*4 GDS__wroblrver2 PARAMETER (GDS__wroblrver2 = 335545032) + INTEGER*4 GDS__trunc_limits + PARAMETER (GDS__trunc_limits = 335545033) INTEGER*4 GDS__gfix_db_name PARAMETER (GDS__gfix_db_name = 335740929) INTEGER*4 GDS__gfix_invalid_sw Modified: firebird/trunk/lang_helpers/gds_codes.pas =================================================================== --- firebird/trunk/lang_helpers/gds_codes.pas 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/lang_helpers/gds_codes.pas 2012-06-06 11:06:31 UTC (rev 54611) @@ -745,6 +745,7 @@ gds_protect_sys_tab = 335545030; gds_libtommath_generic = 335545031; gds_wroblrver2 = 335545032; + gds_trunc_limits = 335545033; gds_gfix_db_name = 335740929; gds_gfix_invalid_sw = 335740930; gds_gfix_incmp_sw = 335740932; Modified: firebird/trunk/src/common/CharSet.cpp =================================================================== --- firebird/trunk/src/common/CharSet.cpp 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/common/CharSet.cpp 2012-06-06 11:06:31 UTC (rev 54611) @@ -108,8 +108,8 @@ FixedWidthCharSet(USHORT _id, charset* _cs) : CharSet(_id, _cs) {} virtual ULONG length(ULONG srcLen, const UCHAR* src, bool countTrailingSpaces) const; - virtual ULONG substring(ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst, - ULONG startPos, ULONG len) const; + virtual ULONG substring(const ULONG srcLen, const UCHAR* src, const ULONG dstLen, UCHAR* dst, + const ULONG startPos, const ULONG len) const; }; class MultiByteCharSet : public CharSet @@ -118,8 +118,8 @@ MultiByteCharSet(USHORT _id, charset* _cs) : CharSet(_id, _cs) {} virtual ULONG length(ULONG srcLen, const UCHAR* src, bool countTrailingSpaces) const; - virtual ULONG substring(ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst, - ULONG startPos, ULONG len) const; + virtual ULONG substring(const ULONG srcLen, const UCHAR* src, const ULONG dstLen, UCHAR* dst, + const ULONG startPos, const ULONG len) const; }; } // namespace @@ -140,8 +140,8 @@ } -ULONG FixedWidthCharSet::substring(ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst, - ULONG startPos, ULONG len) const +ULONG FixedWidthCharSet::substring(const ULONG srcLen, const UCHAR* src, const ULONG dstLen, UCHAR* dst, + const ULONG startPos, const ULONG len) const { ULONG result; @@ -162,7 +162,8 @@ } if (result == INTL_BAD_STR_LENGTH) - status_exception::raise(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + status_exception::raise(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dstLen) << Arg::Num(len)); return result; } @@ -191,8 +192,8 @@ } -ULONG MultiByteCharSet::substring(ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst, - ULONG startPos, ULONG len) const +ULONG MultiByteCharSet::substring(const ULONG srcLen, const UCHAR* src, const ULONG dstLen, UCHAR* dst, + const ULONG startPos, const ULONG len) const { ULONG result; @@ -228,7 +229,8 @@ } if (result == INTL_BAD_STR_LENGTH) - status_exception::raise(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + status_exception::raise(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dstLen) << Arg::Num(len)); return result; } Modified: firebird/trunk/src/common/CharSet.h =================================================================== --- firebird/trunk/src/common/CharSet.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/common/CharSet.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -123,8 +123,8 @@ } virtual ULONG length(ULONG srcLen, const UCHAR* src, bool countTrailingSpaces) const = 0; - virtual ULONG substring(ULONG srcLen, const UCHAR* src, ULONG dstLen, UCHAR* dst, - ULONG startPos, ULONG length) const = 0; + virtual ULONG substring(const ULONG srcLen, const UCHAR* src, const ULONG dstLen, UCHAR* dst, + const ULONG startPos, const ULONG length) const = 0; private: USHORT id; Modified: firebird/trunk/src/common/CsConvert.h =================================================================== --- firebird/trunk/src/common/CsConvert.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/common/CsConvert.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -101,9 +101,9 @@ } // To be used for arbitrary conversions - ULONG convert(ULONG srcLen, + ULONG convert(const ULONG srcLen, const UCHAR* src, - ULONG dstLen, + const ULONG dstLen, UCHAR* dst, ULONG* badInputPos = NULL, bool ignoreTrailingSpaces = false) @@ -119,7 +119,7 @@ ULONG len = (*cnvt1->csconvert_fn_convert)(cnvt1, srcLen, NULL, 0, NULL, &errCode, &errPos); if (len == INTL_BAD_STR_LENGTH || errCode != 0) - raiseError(isc_string_truncation); + raiseError(dstLen, srcLen); fb_assert(len % sizeof(USHORT) == 0); @@ -164,7 +164,7 @@ if (badInputPos) break; - raiseError(isc_string_truncation); + raiseError(dstLen, srcLen); } } @@ -174,7 +174,7 @@ else { if (!badInputPos) - raiseError(isc_string_truncation); + raiseError(dstLen, srcLen); } if (badInputPos) @@ -221,7 +221,7 @@ break; } - raiseError(isc_string_truncation); + raiseError(dstLen, srcLen); } } } @@ -230,7 +230,7 @@ if (badInputPos) *badInputPos = errPos; else - raiseError(isc_string_truncation); + raiseError(dstLen, srcLen); } else raiseError(isc_transliteration_failed); @@ -275,6 +275,14 @@ Firebird::Arg::Gds(code)); } + void raiseError(ULONG dstLen, ULONG srcLen) + { + Firebird::status_exception::raise(Firebird::Arg::Gds(isc_arith_except) << + Firebird::Arg::Gds(isc_string_truncation) << + Firebird::Arg::Gds(isc_trunc_limits) << + Firebird::Arg::Num(dstLen) << Firebird::Arg::Num(srcLen)); + } + }; } // namespace Jrd Modified: firebird/trunk/src/common/cvt.cpp =================================================================== --- firebird/trunk/src/common/cvt.cpp 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/common/cvt.cpp 2012-06-06 11:06:31 UTC (rev 54611) @@ -123,7 +123,9 @@ #define YESTERDAY "YESTERDAY" #define CVT_COPY_BUFF(from, to, len) \ -{if (len) {memcpy(to, from, len); from += len; to += len; len = 0;} } +{if (len) {memcpy(to, from, len); from += len; to += len;} } +// AP,2012: Look like there is no need making len zero, but I keep old define for a reference. +// {if (len) {memcpy(to, from, len); from += len; to += len; len = 0;} } enum EXPECT_DATETIME { @@ -1456,7 +1458,8 @@ } if (l < from->dsc_length) - cb->err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + cb->err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(l) << Arg::Num(from->dsc_length)); Jrd::CharSet* charSet = cb->getToCharset(to->getCharSet()); cb->validateData(charSet, from->dsc_length, from->dsc_address); @@ -1596,7 +1599,9 @@ do { if (*q++ != fill_char) { - cb->err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + cb->err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << + Arg::Num(to->dsc_length) << Arg::Num(from->dsc_length)); } } while (--l); } Modified: firebird/trunk/src/include/gen/codetext.h =================================================================== --- firebird/trunk/src/include/gen/codetext.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/include/gen/codetext.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -734,6 +734,7 @@ {"protect_sys_tab", 335545030}, {"libtommath_generic", 335545031}, {"wroblrver2", 335545032}, + {"trunc_limits", 335545033}, {"gfix_db_name", 335740929}, {"gfix_invalid_sw", 335740930}, {"gfix_incmp_sw", 335740932}, Modified: firebird/trunk/src/include/gen/iberror.h =================================================================== --- firebird/trunk/src/include/gen/iberror.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/include/gen/iberror.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -768,6 +768,7 @@ const ISC_STATUS isc_protect_sys_tab = 335545030L; const ISC_STATUS isc_libtommath_generic = 335545031L; const ISC_STATUS isc_wroblrver2 = 335545032L; +const ISC_STATUS isc_trunc_limits = 335545033L; const ISC_STATUS isc_gfix_db_name = 335740929L; const ISC_STATUS isc_gfix_invalid_sw = 335740930L; const ISC_STATUS isc_gfix_incmp_sw = 335740932L; @@ -1211,7 +1212,7 @@ const ISC_STATUS isc_trace_switch_param_miss = 337182758L; const ISC_STATUS isc_trace_param_act_notcompat = 337182759L; const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L; -const ISC_STATUS isc_err_max = 1155; +const ISC_STATUS isc_err_max = 1156; #else /* c definitions */ @@ -1949,6 +1950,7 @@ #define isc_protect_sys_tab 335545030L #define isc_libtommath_generic 335545031L #define isc_wroblrver2 335545032L +#define isc_trunc_limits 335545033L #define isc_gfix_db_name 335740929L #define isc_gfix_invalid_sw 335740930L #define isc_gfix_incmp_sw 335740932L @@ -2392,7 +2394,7 @@ #define isc_trace_switch_param_miss 337182758L #define isc_trace_param_act_notcompat 337182759L #define isc_trace_mandatory_switch_miss 337182760L -#define isc_err_max 1155 +#define isc_err_max 1156 #endif Modified: firebird/trunk/src/include/gen/msgs.h =================================================================== --- firebird/trunk/src/include/gen/msgs.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/include/gen/msgs.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -737,6 +737,7 @@ {335545030, "@1 operation is not allowed for system table @2"}, /* protect_sys_tab */ {335545031, "Libtommath error code @1 in function @2"}, /* libtommath_generic */ {335545032, "unsupported BLR version (expected between @1 and @2, encountered @3)"}, /* wroblrver2 */ + {335545033, "expected length @1, actual @2"}, /* trunc_limits */ {335740929, "data base file name (@1) already given"}, /* gfix_db_name */ {335740930, "invalid switch @1"}, /* gfix_invalid_sw */ {335740932, "incompatible switch combination"}, /* gfix_incmp_sw */ Modified: firebird/trunk/src/include/gen/sql_code.h =================================================================== --- firebird/trunk/src/include/gen/sql_code.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/include/gen/sql_code.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -733,6 +733,7 @@ {335545030, -902}, /* 710 protect_sys_tab */ {335545031, -901}, /* 711 libtommath_generic */ {335545032, -902}, /* 712 wroblrver2 */ + {335545033, -802}, /* 713 trunc_limits */ {335740929, -901}, /* 1 gfix_db_name */ {335740930, -901}, /* 2 gfix_invalid_sw */ {335740932, -901}, /* 4 gfix_incmp_sw */ Modified: firebird/trunk/src/include/gen/sql_state.h =================================================================== --- firebird/trunk/src/include/gen/sql_state.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/include/gen/sql_state.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -733,6 +733,7 @@ {335545030, "42000"}, // 710 protect_sys_tab {335545031, "2F000"}, // 711 libtommath_generic {335545032, "HY000"}, // 712 wroblrver2 + {335545033, "22001"}, // 713 trunc_limits {335740929, "00000"}, // 1 gfix_db_name {335740930, "00000"}, // 2 gfix_invalid_sw {335740932, "00000"}, // 4 gfix_incmp_sw Modified: firebird/trunk/src/jrd/cvt.cpp =================================================================== --- firebird/trunk/src/jrd/cvt.cpp 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/jrd/cvt.cpp 2012-06-06 11:06:31 UTC (rev 54611) @@ -424,11 +424,15 @@ Jrd::thread_db* tdbb = NULL; SET_TDBB(tdbb); + const ULONG src_len = toCharSet->length(toLength, start, false); + const ULONG dest_len = (ULONG) to_size / toCharSet->maxBytesPerChar(); + if (toCharSet->isMultiByte() && !(toCharSet->getFlags() & CHARSET_LEGACY_SEMANTICS) && - toCharSet->length(toLength, start, false) > (ULONG) to_size / toCharSet->maxBytesPerChar()) + src_len > dest_len) { - err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len)); } } } Modified: firebird/trunk/src/jrd/intl.cpp =================================================================== --- firebird/trunk/src/jrd/intl.cpp 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/jrd/intl.cpp 2012-06-06 11:06:31 UTC (rev 54611) @@ -694,10 +694,10 @@ ULONG INTL_convert_bytes(thread_db* tdbb, CHARSET_ID dest_type, BYTE* dest_ptr, - ULONG dest_len, + const ULONG dest_len, CHARSET_ID src_type, const BYTE* src_ptr, - ULONG src_len, + const ULONG src_len, ErrorFunction err) { /************************************** @@ -758,7 +758,8 @@ if (len == 0 || allSpaces(INTL_charset_lookup(tdbb, src_type), src_ptr, len, 0)) return dest_ptr - start_dest_ptr; - err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len)); } else if (src_len) { @@ -950,19 +951,24 @@ break; } + const ULONG src_len = toCharSet->length(toLength, start, false); + const ULONG dest_len = (ULONG) to_size / toCharSet->maxBytesPerChar(); + if (toCharSet->isMultiByte() && !(toCharSet->getFlags() & CHARSET_LEGACY_SEMANTICS) && toLength != 31 && // allow non CHARSET_LEGACY_SEMANTICS to be used as connection charset - toCharSet->length(toLength, start, false) > to_size / toCharSet->maxBytesPerChar()) + src_len > dest_len) { - err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len)); } if (from_fill) { // Make sure remaining characters on From string are spaces if (!allSpaces(INTL_charset_lookup(tdbb, from_cs), q, from_fill, 0)) - err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation)); + err(Arg::Gds(isc_arith_except) << Arg::Gds(isc_string_truncation) << + Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len)); } return 0; Modified: firebird/trunk/src/jrd/intl_proto.h =================================================================== --- firebird/trunk/src/jrd/intl_proto.h 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/jrd/intl_proto.h 2012-06-06 11:06:31 UTC (rev 54611) @@ -38,8 +38,8 @@ void INTL_adjust_text_descriptor(Jrd::thread_db* tdbb, dsc* desc); CHARSET_ID INTL_charset(Jrd::thread_db*, USHORT); int INTL_compare(Jrd::thread_db*, const dsc*, const dsc*, ErrorFunction); -ULONG INTL_convert_bytes(Jrd::thread_db*, CHARSET_ID, UCHAR*, ULONG, CHARSET_ID, - const BYTE*, ULONG, ErrorFunction); +ULONG INTL_convert_bytes(Jrd::thread_db*, CHARSET_ID, UCHAR*, const ULONG, CHARSET_ID, + const BYTE*, const ULONG, ErrorFunction); Jrd::CsConvert INTL_convert_lookup(Jrd::thread_db*, CHARSET_ID, CHARSET_ID); int INTL_convert_string(dsc*, const dsc*, ErrorFunction); bool INTL_data(const dsc*); Modified: firebird/trunk/src/msgs/facilities2.sql =================================================================== --- firebird/trunk/src/msgs/facilities2.sql 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/msgs/facilities2.sql 2012-06-06 11:06:31 UTC (rev 54611) @@ -1,7 +1,7 @@ /* MAX_NUMBER is the next number to be used, always one more than the highest message number. */ set bulk_insert INSERT INTO FACILITIES (LAST_CHANGE, FACILITY, FAC_CODE, MAX_NUMBER) VALUES (?, ?, ?, ?); -- -('2012-03-06 02:21:55', 'JRD', 0, 713) +('2012-06-05 15:01:35', 'JRD', 0, 714) ('2012-01-23 20:10:30', 'QLI', 1, 532) ('2009-07-16 05:26:11', 'GFIX', 3, 121) ('1996-11-07 13:39:40', 'GPRE', 4, 1) Modified: firebird/trunk/src/msgs/messages2.sql =================================================================== --- firebird/trunk/src/msgs/messages2.sql 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/msgs/messages2.sql 2012-06-06 11:06:31 UTC (rev 54611) @@ -820,6 +820,7 @@ ('protect_sys_tab', NULL, 'vio.cpp', NULL, 0, 710, NULL, '@1 operation is not allowed for system table @2', NULL, NULL) ('libtommath_generic', 'check', 'BigInteger.cpp', NULL, 0, 711, NULL, 'Libtommath error code @1 in function @2', NULL, NULL) ('wroblrver2', NULL, NULL, NULL, 0, 712, NULL, 'unsupported BLR version (expected between @1 and @2, encountered @3)', NULL, NULL); +('trunc_limits', NULL, NULL, NULL, 0, 713, NULL, 'expected length @1, actual @2', NULL, NULL); -- QLI (NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL); (NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL); Modified: firebird/trunk/src/msgs/system_errors2.sql =================================================================== --- firebird/trunk/src/msgs/system_errors2.sql 2012-06-06 10:24:18 UTC (rev 54610) +++ firebird/trunk/src/msgs/system_errors2.sql 2012-06-06 11:06:31 UTC (rev 54611) @@ -719,6 +719,7 @@ -- If you have better SQL code for this, change it. (-901, '2F', '000', 0, 711, 'libtommath_generic', NULL, NULL) (-902, 'HY', '000', 0, 712, 'wroblrver2', NULL, NULL) +(-802, '22', '001', 0, 713, 'trunc_limits', NULL, NULL) -- GFIX (-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL) (-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |