mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-22 22:03:03 +01:00
Fixed CORE-6248: A number of errors when database name is longer than 255 symbols
This commit is contained in:
parent
b11189f1bb
commit
684e17d0e4
@ -1942,6 +1942,12 @@ C --
|
|||||||
PARAMETER (GDS__dyn_no_create_priv = 335545264)
|
PARAMETER (GDS__dyn_no_create_priv = 335545264)
|
||||||
INTEGER*4 GDS__suspend_without_returns
|
INTEGER*4 GDS__suspend_without_returns
|
||||||
PARAMETER (GDS__suspend_without_returns = 335545265)
|
PARAMETER (GDS__suspend_without_returns = 335545265)
|
||||||
|
INTEGER*4 GDS__truncate_warn
|
||||||
|
PARAMETER (GDS__truncate_warn = 335545266)
|
||||||
|
INTEGER*4 GDS__truncate_monitor
|
||||||
|
PARAMETER (GDS__truncate_monitor = 335545267)
|
||||||
|
INTEGER*4 GDS__truncate_context
|
||||||
|
PARAMETER (GDS__truncate_context = 335545268)
|
||||||
INTEGER*4 GDS__gfix_db_name
|
INTEGER*4 GDS__gfix_db_name
|
||||||
PARAMETER (GDS__gfix_db_name = 335740929)
|
PARAMETER (GDS__gfix_db_name = 335740929)
|
||||||
INTEGER*4 GDS__gfix_invalid_sw
|
INTEGER*4 GDS__gfix_invalid_sw
|
||||||
|
@ -1937,6 +1937,12 @@ const
|
|||||||
gds_dyn_no_create_priv = 335545264;
|
gds_dyn_no_create_priv = 335545264;
|
||||||
isc_suspend_without_returns = 335545265;
|
isc_suspend_without_returns = 335545265;
|
||||||
gds_suspend_without_returns = 335545265;
|
gds_suspend_without_returns = 335545265;
|
||||||
|
isc_truncate_warn = 335545266;
|
||||||
|
gds_truncate_warn = 335545266;
|
||||||
|
isc_truncate_monitor = 335545267;
|
||||||
|
gds_truncate_monitor = 335545267;
|
||||||
|
isc_truncate_context = 335545268;
|
||||||
|
gds_truncate_context = 335545268;
|
||||||
isc_gfix_db_name = 335740929;
|
isc_gfix_db_name = 335740929;
|
||||||
gds_gfix_db_name = 335740929;
|
gds_gfix_db_name = 335740929;
|
||||||
isc_gfix_invalid_sw = 335740930;
|
isc_gfix_invalid_sw = 335740930;
|
||||||
|
@ -1666,25 +1666,22 @@ static void prompt_for_name(SCHAR* name, int length)
|
|||||||
//
|
//
|
||||||
// Write an attribute starting with a null terminated string.
|
// Write an attribute starting with a null terminated string.
|
||||||
//
|
//
|
||||||
static void put_asciz( SCHAR attribute, const TEXT* string)
|
static void put_asciz( SCHAR attribute, const TEXT* str)
|
||||||
{
|
{
|
||||||
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
BurpGlobals* tdgbl = BurpGlobals::getSpecific();
|
||||||
|
|
||||||
SSHORT l = 0;
|
USHORT l = strlen(str);
|
||||||
for (const TEXT *p = string; *p; p++)
|
if (l > MAX_UCHAR)
|
||||||
{
|
{
|
||||||
l++;
|
BURP_print(false, 343, SafeArg() << int(attribute) << "put_asciz()" << USHORT(MAX_UCHAR));
|
||||||
|
// msg 343: text for attribute @1 is too large in @2, truncating to @3 bytes
|
||||||
|
l = MAX_UCHAR;
|
||||||
}
|
}
|
||||||
fb_assert(l <= MAX_UCHAR);
|
|
||||||
|
|
||||||
put(tdgbl, attribute);
|
put(tdgbl, attribute);
|
||||||
put(tdgbl, l);
|
put(tdgbl, l);
|
||||||
if (l)
|
while (l--)
|
||||||
{
|
put(tdgbl, *str++);
|
||||||
do {
|
|
||||||
put(tdgbl, *string++);
|
|
||||||
} while (--l);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -431,7 +431,7 @@ static void integer_to_text(const dsc* from, dsc* to, Callbacks* cb)
|
|||||||
// fits. Keep in mind that routine handles both string and varying
|
// fits. Keep in mind that routine handles both string and varying
|
||||||
// string fields.
|
// string fields.
|
||||||
|
|
||||||
const USHORT length = l + neg + decimal + pad_count;
|
USHORT length = l + neg + decimal + pad_count;
|
||||||
|
|
||||||
if ((to->dsc_dtype == dtype_text && length > to->dsc_length) ||
|
if ((to->dsc_dtype == dtype_text && length > to->dsc_length) ||
|
||||||
(to->dsc_dtype == dtype_cstring && length >= to->dsc_length) ||
|
(to->dsc_dtype == dtype_cstring && length >= to->dsc_length) ||
|
||||||
@ -469,7 +469,7 @@ static void integer_to_text(const dsc* from, dsc* to, Callbacks* cb)
|
|||||||
} while (++scale);
|
} while (++scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
cb->validateLength(cb->getToCharset(to->getCharSet()), length, start, TEXT_LEN(to));
|
length = cb->validateLength(cb->getToCharset(to->getCharSet()), length, start, TEXT_LEN(to));
|
||||||
|
|
||||||
// If padding is required, do it now.
|
// If padding is required, do it now.
|
||||||
|
|
||||||
@ -1802,8 +1802,32 @@ void CVT_move_common(const dsc* from, dsc* to, DecimalStatus decSt, Callbacks* c
|
|||||||
const UCHAR* start = to->dsc_address;
|
const UCHAR* start = to->dsc_address;
|
||||||
UCHAR fill_char = ASCII_SPACE;
|
UCHAR fill_char = ASCII_SPACE;
|
||||||
Jrd::CharSet* toCharset = cb->getToCharset(charset2);
|
Jrd::CharSet* toCharset = cb->getToCharset(charset2);
|
||||||
ULONG toLength = 0;
|
|
||||||
ULONG fill;
|
switch (to->dsc_dtype)
|
||||||
|
{
|
||||||
|
case dtype_text:
|
||||||
|
length = MIN(length, to->dsc_length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dtype_cstring:
|
||||||
|
// Note: Following is only correct for narrow and
|
||||||
|
// multibyte character sets which use a zero
|
||||||
|
// byte to represent end-of-string
|
||||||
|
|
||||||
|
fb_assert(to->dsc_length > 0);
|
||||||
|
length = MIN(length, ULONG(to->dsc_length - 1));
|
||||||
|
break;
|
||||||
|
|
||||||
|
case dtype_varying:
|
||||||
|
length = to->dsc_length > sizeof(USHORT) ?
|
||||||
|
MIN(length, (ULONG(to->dsc_length) - sizeof(USHORT))) : 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cb->validateData(toCharset, length, q);
|
||||||
|
ULONG toLength = cb->validateLength(toCharset, length, q, to_size);
|
||||||
|
len -= toLength;
|
||||||
|
ULONG fill = ULONG(to->dsc_length) - toLength;
|
||||||
|
|
||||||
if (charset2 == ttype_binary)
|
if (charset2 == ttype_binary)
|
||||||
fill_char = 0x00;
|
fill_char = 0x00;
|
||||||
@ -1811,14 +1835,7 @@ void CVT_move_common(const dsc* from, dsc* to, DecimalStatus decSt, Callbacks* c
|
|||||||
switch (to->dsc_dtype)
|
switch (to->dsc_dtype)
|
||||||
{
|
{
|
||||||
case dtype_text:
|
case dtype_text:
|
||||||
length = MIN(length, to->dsc_length);
|
CVT_COPY_BUFF(q, p, toLength);
|
||||||
cb->validateData(toCharset, length, q);
|
|
||||||
toLength = length;
|
|
||||||
|
|
||||||
len -= length;
|
|
||||||
fill = ULONG(to->dsc_length) - length;
|
|
||||||
|
|
||||||
CVT_COPY_BUFF(q, p, length);
|
|
||||||
if (fill > 0)
|
if (fill > 0)
|
||||||
{
|
{
|
||||||
memset(p, fill_char, fill);
|
memset(p, fill_char, fill);
|
||||||
@ -1830,49 +1847,32 @@ void CVT_move_common(const dsc* from, dsc* to, DecimalStatus decSt, Callbacks* c
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_cstring:
|
case dtype_cstring:
|
||||||
// Note: Following is only correct for narrow and
|
CVT_COPY_BUFF(q, p, toLength);
|
||||||
// multibyte character sets which use a zero
|
|
||||||
// byte to represent end-of-string
|
|
||||||
|
|
||||||
fb_assert(to->dsc_length > 0);
|
|
||||||
length = MIN(length, ULONG(to->dsc_length - 1));
|
|
||||||
cb->validateData(toCharset, length, q);
|
|
||||||
toLength = length;
|
|
||||||
|
|
||||||
len -= length;
|
|
||||||
CVT_COPY_BUFF(q, p, length);
|
|
||||||
*p = 0;
|
*p = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_varying:
|
case dtype_varying:
|
||||||
if (to->dsc_length > sizeof(USHORT))
|
if (to->dsc_length > sizeof(USHORT))
|
||||||
{
|
{
|
||||||
length = MIN(length, (ULONG(to->dsc_length) - sizeof(USHORT)));
|
|
||||||
cb->validateData(toCharset, length, q);
|
|
||||||
toLength = length;
|
|
||||||
|
|
||||||
len -= length;
|
|
||||||
// TMN: Here we should really have the following fb_assert
|
// TMN: Here we should really have the following fb_assert
|
||||||
// fb_assert(length <= MAX_USHORT);
|
// fb_assert(length <= MAX_USHORT);
|
||||||
((vary*) p)->vary_length = (USHORT) length;
|
((vary*) p)->vary_length = (USHORT) toLength;
|
||||||
start = p = reinterpret_cast<UCHAR*>(((vary*) p)->vary_string);
|
start = p = reinterpret_cast<UCHAR*>(((vary*) p)->vary_string);
|
||||||
CVT_COPY_BUFF(q, p, length);
|
CVT_COPY_BUFF(q, p, toLength);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
memset(to->dsc_address, 0, to->dsc_length); // the best we can do
|
memset(to->dsc_address, 0, to->dsc_length); // the best we can do
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb->validateLength(toCharset, toLength, start, to_size);
|
if (len && toLength == length)
|
||||||
|
|
||||||
if (len)
|
|
||||||
{
|
{
|
||||||
// Scan the truncated string to ensure only spaces lost
|
// Scan the truncated string to ensure only spaces lost
|
||||||
// Warning: it is correct only for narrow and multi-byte
|
// Warning: it is correct only for narrow and multi-byte
|
||||||
// character sets which use ASCII or NULL for the SPACE character
|
// character sets which use ASCII or NULL for the SPACE character
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (*q++ != fill_char)
|
if (*q++ != fill_char && toLength == 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::Gds(isc_trunc_limits) <<
|
||||||
@ -3545,7 +3545,7 @@ namespace
|
|||||||
virtual CHARSET_ID getChid(const dsc* d);
|
virtual CHARSET_ID getChid(const dsc* d);
|
||||||
virtual Jrd::CharSet* getToCharset(CHARSET_ID charset2);
|
virtual Jrd::CharSet* getToCharset(CHARSET_ID charset2);
|
||||||
virtual void validateData(Jrd::CharSet* toCharset, SLONG length, const UCHAR* q);
|
virtual void validateData(Jrd::CharSet* toCharset, SLONG length, const UCHAR* q);
|
||||||
virtual void validateLength(Jrd::CharSet* toCharset, SLONG toLength, const UCHAR* start,
|
virtual ULONG validateLength(Jrd::CharSet* toCharset, ULONG toLength, const UCHAR* start,
|
||||||
const USHORT to_size);
|
const USHORT to_size);
|
||||||
virtual SLONG getLocalDate();
|
virtual SLONG getLocalDate();
|
||||||
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp();
|
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp();
|
||||||
@ -3568,8 +3568,9 @@ namespace
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void CommonCallbacks::validateLength(Jrd::CharSet*, SLONG, const UCHAR*, const USHORT)
|
ULONG CommonCallbacks::validateLength(Jrd::CharSet*, ULONG l, const UCHAR*, const USHORT)
|
||||||
{
|
{
|
||||||
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHARSET_ID CommonCallbacks::getChid(const dsc* d)
|
CHARSET_ID CommonCallbacks::getChid(const dsc* d)
|
||||||
|
@ -58,7 +58,7 @@ public:
|
|||||||
virtual CHARSET_ID getChid(const dsc* d) = 0;
|
virtual CHARSET_ID getChid(const dsc* d) = 0;
|
||||||
virtual Jrd::CharSet* getToCharset(CHARSET_ID charset2) = 0;
|
virtual Jrd::CharSet* getToCharset(CHARSET_ID charset2) = 0;
|
||||||
virtual void validateData(Jrd::CharSet* toCharset, SLONG length, const UCHAR* q) = 0;
|
virtual void validateData(Jrd::CharSet* toCharset, SLONG length, const UCHAR* q) = 0;
|
||||||
virtual void validateLength(Jrd::CharSet* toCharset, SLONG toLength, const UCHAR* start,
|
virtual ULONG validateLength(Jrd::CharSet* toCharset, ULONG toLength, const UCHAR* start,
|
||||||
const USHORT to_size) = 0;
|
const USHORT to_size) = 0;
|
||||||
virtual SLONG getLocalDate() = 0;
|
virtual SLONG getLocalDate() = 0;
|
||||||
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp() = 0;
|
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp() = 0;
|
||||||
|
@ -967,6 +967,9 @@ static const struct {
|
|||||||
{"cannot_read_new_blob", 335545263},
|
{"cannot_read_new_blob", 335545263},
|
||||||
{"dyn_no_create_priv", 335545264},
|
{"dyn_no_create_priv", 335545264},
|
||||||
{"suspend_without_returns", 335545265},
|
{"suspend_without_returns", 335545265},
|
||||||
|
{"truncate_warn", 335545266},
|
||||||
|
{"truncate_monitor", 335545267},
|
||||||
|
{"truncate_context", 335545268},
|
||||||
{"gfix_db_name", 335740929},
|
{"gfix_db_name", 335740929},
|
||||||
{"gfix_invalid_sw", 335740930},
|
{"gfix_invalid_sw", 335740930},
|
||||||
{"gfix_incmp_sw", 335740932},
|
{"gfix_incmp_sw", 335740932},
|
||||||
|
@ -1001,6 +1001,9 @@ const ISC_STATUS isc_cannot_update_old_blob = 335545262L;
|
|||||||
const ISC_STATUS isc_cannot_read_new_blob = 335545263L;
|
const ISC_STATUS isc_cannot_read_new_blob = 335545263L;
|
||||||
const ISC_STATUS isc_dyn_no_create_priv = 335545264L;
|
const ISC_STATUS isc_dyn_no_create_priv = 335545264L;
|
||||||
const ISC_STATUS isc_suspend_without_returns = 335545265L;
|
const ISC_STATUS isc_suspend_without_returns = 335545265L;
|
||||||
|
const ISC_STATUS isc_truncate_warn = 335545266L;
|
||||||
|
const ISC_STATUS isc_truncate_monitor = 335545267L;
|
||||||
|
const ISC_STATUS isc_truncate_context = 335545268L;
|
||||||
const ISC_STATUS isc_gfix_db_name = 335740929L;
|
const ISC_STATUS isc_gfix_db_name = 335740929L;
|
||||||
const ISC_STATUS isc_gfix_invalid_sw = 335740930L;
|
const ISC_STATUS isc_gfix_invalid_sw = 335740930L;
|
||||||
const ISC_STATUS isc_gfix_incmp_sw = 335740932L;
|
const ISC_STATUS isc_gfix_incmp_sw = 335740932L;
|
||||||
@ -1491,7 +1494,7 @@ const ISC_STATUS isc_trace_switch_user_only = 337182757L;
|
|||||||
const ISC_STATUS isc_trace_switch_param_miss = 337182758L;
|
const ISC_STATUS isc_trace_switch_param_miss = 337182758L;
|
||||||
const ISC_STATUS isc_trace_param_act_notcompat = 337182759L;
|
const ISC_STATUS isc_trace_param_act_notcompat = 337182759L;
|
||||||
const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L;
|
const ISC_STATUS isc_trace_mandatory_switch_miss = 337182760L;
|
||||||
const ISC_STATUS isc_err_max = 1435;
|
const ISC_STATUS isc_err_max = 1438;
|
||||||
|
|
||||||
#else /* c definitions */
|
#else /* c definitions */
|
||||||
|
|
||||||
@ -2462,6 +2465,9 @@ const ISC_STATUS isc_err_max = 1435;
|
|||||||
#define isc_cannot_read_new_blob 335545263L
|
#define isc_cannot_read_new_blob 335545263L
|
||||||
#define isc_dyn_no_create_priv 335545264L
|
#define isc_dyn_no_create_priv 335545264L
|
||||||
#define isc_suspend_without_returns 335545265L
|
#define isc_suspend_without_returns 335545265L
|
||||||
|
#define isc_truncate_warn 335545266L
|
||||||
|
#define isc_truncate_monitor 335545267L
|
||||||
|
#define isc_truncate_context 335545268L
|
||||||
#define isc_gfix_db_name 335740929L
|
#define isc_gfix_db_name 335740929L
|
||||||
#define isc_gfix_invalid_sw 335740930L
|
#define isc_gfix_invalid_sw 335740930L
|
||||||
#define isc_gfix_incmp_sw 335740932L
|
#define isc_gfix_incmp_sw 335740932L
|
||||||
@ -2952,7 +2958,7 @@ const ISC_STATUS isc_err_max = 1435;
|
|||||||
#define isc_trace_switch_param_miss 337182758L
|
#define isc_trace_switch_param_miss 337182758L
|
||||||
#define isc_trace_param_act_notcompat 337182759L
|
#define isc_trace_param_act_notcompat 337182759L
|
||||||
#define isc_trace_mandatory_switch_miss 337182760L
|
#define isc_trace_mandatory_switch_miss 337182760L
|
||||||
#define isc_err_max 1435
|
#define isc_err_max 1438
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -970,6 +970,9 @@ Data source : @4"}, /* eds_statement */
|
|||||||
{335545263, "cannot read from new BLOB"}, /* cannot_read_new_blob */
|
{335545263, "cannot read from new BLOB"}, /* cannot_read_new_blob */
|
||||||
{335545264, "No permission for CREATE @1 operation"}, /* dyn_no_create_priv */
|
{335545264, "No permission for CREATE @1 operation"}, /* dyn_no_create_priv */
|
||||||
{335545265, "SUSPEND could not be used without RETURNS clause in PROCEDURE or EXECUTE BLOCK"}, /* suspend_without_returns */
|
{335545265, "SUSPEND could not be used without RETURNS clause in PROCEDURE or EXECUTE BLOCK"}, /* suspend_without_returns */
|
||||||
|
{335545266, "String truncated warning due to the following reason"}, /* truncate_warn */
|
||||||
|
{335545267, "Monitoring data does not fit into the field"}, /* truncate_monitor */
|
||||||
|
{335545268, "Engine data does not fit into return value of system function"}, /* truncate_context */
|
||||||
{335740929, "data base file name (@1) already given"}, /* gfix_db_name */
|
{335740929, "data base file name (@1) already given"}, /* gfix_db_name */
|
||||||
{335740930, "invalid switch @1"}, /* gfix_invalid_sw */
|
{335740930, "invalid switch @1"}, /* gfix_invalid_sw */
|
||||||
{335740932, "incompatible switch combination"}, /* gfix_incmp_sw */
|
{335740932, "incompatible switch combination"}, /* gfix_incmp_sw */
|
||||||
|
@ -966,6 +966,9 @@ static const struct {
|
|||||||
{335545263, -402}, /* 943 cannot_read_new_blob */
|
{335545263, -402}, /* 943 cannot_read_new_blob */
|
||||||
{335545264, -901}, /* 944 dyn_no_create_priv */
|
{335545264, -901}, /* 944 dyn_no_create_priv */
|
||||||
{335545265, -901}, /* 945 suspend_without_returns */
|
{335545265, -901}, /* 945 suspend_without_returns */
|
||||||
|
{335545266, 304}, /* 946 truncate_warn */
|
||||||
|
{335545267, 304}, /* 947 truncate_monitor */
|
||||||
|
{335545268, 304}, /* 948 truncate_context */
|
||||||
{335740929, -901}, /* 1 gfix_db_name */
|
{335740929, -901}, /* 1 gfix_db_name */
|
||||||
{335740930, -901}, /* 2 gfix_invalid_sw */
|
{335740930, -901}, /* 2 gfix_invalid_sw */
|
||||||
{335740932, -901}, /* 4 gfix_incmp_sw */
|
{335740932, -901}, /* 4 gfix_incmp_sw */
|
||||||
|
@ -966,6 +966,9 @@ static const struct {
|
|||||||
{335545263, "42000"}, // 943 cannot_read_new_blob
|
{335545263, "42000"}, // 943 cannot_read_new_blob
|
||||||
{335545264, "42000"}, // 944 dyn_no_create_priv
|
{335545264, "42000"}, // 944 dyn_no_create_priv
|
||||||
{335545265, "42000"}, // 945 suspend_without_returns
|
{335545265, "42000"}, // 945 suspend_without_returns
|
||||||
|
{335545266, "01004"}, // 946 truncate_warn
|
||||||
|
{335545267, "01004"}, // 947 truncate_monitor
|
||||||
|
{335545268, "01004"}, // 948 truncate_context
|
||||||
{335740929, "00000"}, // 1 gfix_db_name
|
{335740929, "00000"}, // 1 gfix_db_name
|
||||||
{335740930, "00000"}, // 2 gfix_invalid_sw
|
{335740930, "00000"}, // 2 gfix_invalid_sw
|
||||||
{335740932, "00000"}, // 4 gfix_incmp_sw
|
{335740932, "00000"}, // 4 gfix_incmp_sw
|
||||||
|
@ -44,6 +44,7 @@
|
|||||||
#include "../jrd/mov_proto.h"
|
#include "../jrd/mov_proto.h"
|
||||||
#include "../jrd/opt_proto.h"
|
#include "../jrd/opt_proto.h"
|
||||||
#include "../jrd/pag_proto.h"
|
#include "../jrd/pag_proto.h"
|
||||||
|
#include "../jrd/cvt_proto.h"
|
||||||
#include "../jrd/CryptoManager.h"
|
#include "../jrd/CryptoManager.h"
|
||||||
|
|
||||||
#include "../jrd/Relation.h"
|
#include "../jrd/Relation.h"
|
||||||
@ -727,7 +728,9 @@ void SnapshotData::putField(thread_db* tdbb, Record* record, const DumpField& fi
|
|||||||
{
|
{
|
||||||
dsc from_desc;
|
dsc from_desc;
|
||||||
from_desc.makeText(field.length, CS_METADATA, (UCHAR*) field.data);
|
from_desc.makeText(field.length, CS_METADATA, (UCHAR*) field.data);
|
||||||
MOV_move(tdbb, &from_desc, &to_desc);
|
|
||||||
|
TruncateCallbacks tcb(isc_truncate_monitor);
|
||||||
|
CVT_move_common(&from_desc, &to_desc, 0, &tcb); // no need in decimal status for string=>string move
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (field.type == VALUE_BOOLEAN)
|
else if (field.type == VALUE_BOOLEAN)
|
||||||
|
@ -169,6 +169,7 @@ const HashAlgorithmDescriptor* HashAlgorithmDescriptor::find(const char* name)
|
|||||||
|
|
||||||
// constants
|
// constants
|
||||||
const int oneDay = 86400;
|
const int oneDay = 86400;
|
||||||
|
const unsigned getContextLen = 255;
|
||||||
|
|
||||||
// auxiliary functions
|
// auxiliary functions
|
||||||
void add10msec(ISC_TIMESTAMP* v, SINT64 msec, SINT64 multiplier);
|
void add10msec(ISC_TIMESTAMP* v, SINT64 msec, SINT64 multiplier);
|
||||||
@ -1220,7 +1221,7 @@ void makeGetSetContext(DataTypeUtilBase* /*dataTypeUtil*/, const SysFunction* fu
|
|||||||
result->makeLong(0);
|
result->makeLong(0);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result->makeVarying(255, ttype_none);
|
result->makeVarying(getContextLen, ttype_none);
|
||||||
result->setNullable(true);
|
result->setNullable(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4281,7 +4282,13 @@ dsc* evlGetContext(thread_db* tdbb, const SysFunction*, const NestValueArray& ar
|
|||||||
}
|
}
|
||||||
|
|
||||||
dsc result;
|
dsc result;
|
||||||
result.makeText(resultStr.length(), resultType,
|
unsigned l = resultStr.length();
|
||||||
|
if (l > getContextLen)
|
||||||
|
{
|
||||||
|
l = getContextLen;
|
||||||
|
ERR_post_warning(Arg::Warning(isc_truncate_warn) << Arg::Warning(isc_truncate_context));
|
||||||
|
}
|
||||||
|
result.makeText(l, resultType,
|
||||||
(UCHAR*) const_cast<char*>(resultStr.c_str())); // safe const_cast
|
(UCHAR*) const_cast<char*>(resultStr.c_str())); // safe const_cast
|
||||||
EVL_make_value(tdbb, &result, impure);
|
EVL_make_value(tdbb, &result, impure);
|
||||||
|
|
||||||
|
@ -479,14 +479,11 @@ void EngineCallbacks::validateData(CharSet* toCharSet, SLONG length, const UCHAR
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void EngineCallbacks::validateLength(CharSet* toCharSet, SLONG toLength, const UCHAR* start,
|
ULONG EngineCallbacks::validateLength(CharSet* toCharSet, ULONG toLength, const UCHAR* start,
|
||||||
const USHORT to_size)
|
const USHORT to_size)
|
||||||
{
|
{
|
||||||
if (toCharSet && toCharSet->isMultiByte())
|
if (toCharSet && toCharSet->isMultiByte())
|
||||||
{
|
{
|
||||||
Jrd::thread_db* tdbb = NULL;
|
|
||||||
SET_TDBB(tdbb);
|
|
||||||
|
|
||||||
const ULONG src_len = toCharSet->length(toLength, start, false);
|
const ULONG src_len = toCharSet->length(toLength, start, false);
|
||||||
const ULONG dest_len = (ULONG) to_size / toCharSet->maxBytesPerChar();
|
const ULONG dest_len = (ULONG) to_size / toCharSet->maxBytesPerChar();
|
||||||
|
|
||||||
@ -496,6 +493,31 @@ void EngineCallbacks::validateLength(CharSet* toCharSet, SLONG toLength, const U
|
|||||||
Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len));
|
Arg::Gds(isc_trunc_limits) << Arg::Num(dest_len) << Arg::Num(src_len));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return toLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ULONG TruncateCallbacks::validateLength(CharSet* toCharSet, ULONG toLength, const UCHAR* start,
|
||||||
|
const USHORT to_size)
|
||||||
|
{
|
||||||
|
if (toCharSet && toCharSet->isMultiByte())
|
||||||
|
{
|
||||||
|
const ULONG dest_len = (ULONG) to_size / toCharSet->maxBytesPerChar();
|
||||||
|
|
||||||
|
for (bool first = true; ; first = false)
|
||||||
|
{
|
||||||
|
const ULONG src_len = toCharSet->length(toLength, start, false);
|
||||||
|
if (src_len <= dest_len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
toLength -= (src_len - dest_len); // truncate
|
||||||
|
if (first)
|
||||||
|
ERR_post_warning(Arg::Warning(isc_truncate_warn) << Arg::Warning(truncateReason));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return toLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ namespace Jrd
|
|||||||
virtual CHARSET_ID getChid(const dsc* d);
|
virtual CHARSET_ID getChid(const dsc* d);
|
||||||
virtual CharSet* getToCharset(CHARSET_ID charset2);
|
virtual CharSet* getToCharset(CHARSET_ID charset2);
|
||||||
virtual void validateData(CharSet* toCharset, SLONG length, const UCHAR* q);
|
virtual void validateData(CharSet* toCharset, SLONG length, const UCHAR* q);
|
||||||
virtual void validateLength(CharSet* toCharset, SLONG toLength, const UCHAR* start,
|
virtual ULONG validateLength(CharSet* toCharset, ULONG toLength, const UCHAR* start,
|
||||||
const USHORT to_size);
|
const USHORT to_size);
|
||||||
virtual SLONG getLocalDate();
|
virtual SLONG getLocalDate();
|
||||||
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp();
|
virtual ISC_TIMESTAMP getCurrentGmtTimeStamp();
|
||||||
@ -67,6 +67,21 @@ namespace Jrd
|
|||||||
public:
|
public:
|
||||||
static Firebird::GlobalPtr<EngineCallbacks> instance;
|
static Firebird::GlobalPtr<EngineCallbacks> instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class TruncateCallbacks : public EngineCallbacks
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit TruncateCallbacks(ISC_STATUS tr)
|
||||||
|
: EngineCallbacks(ERR_post), truncateReason(tr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ULONG validateLength(CharSet* toCharset, ULONG toLength, const UCHAR* start,
|
||||||
|
const USHORT to_size);
|
||||||
|
|
||||||
|
private:
|
||||||
|
const ISC_STATUS truncateReason;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void CVT_move(const dsc* from, dsc* to, Firebird::DecimalStatus decSt)
|
inline void CVT_move(const dsc* from, dsc* to, Firebird::DecimalStatus decSt)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/* MAX_NUMBER is the next number to be used, always one more than the highest message number. */
|
/* 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 (?, ?, ?, ?);
|
set bulk_insert INSERT INTO FACILITIES (LAST_CHANGE, FACILITY, FAC_CODE, MAX_NUMBER) VALUES (?, ?, ?, ?);
|
||||||
--
|
--
|
||||||
('2020-02-04 12:10:00', 'JRD', 0, 946)
|
('2020-03-04 16:39:50', 'JRD', 0, 949)
|
||||||
('2015-03-17 18:33:00', 'QLI', 1, 533)
|
('2015-03-17 18:33:00', 'QLI', 1, 533)
|
||||||
('2018-03-17 12:00:00', 'GFIX', 3, 136)
|
('2018-03-17 12:00:00', 'GFIX', 3, 136)
|
||||||
('1996-11-07 13:39:40', 'GPRE', 4, 1)
|
('1996-11-07 13:39:40', 'GPRE', 4, 1)
|
||||||
|
@ -1053,6 +1053,9 @@ Data source : @4', NULL, NULL)
|
|||||||
('cannot_read_new_blob', 'BLB_get_segment', 'blb.cpp', NULL, 0, 943, NULL, 'cannot read from new BLOB', NULL, NULL);
|
('cannot_read_new_blob', 'BLB_get_segment', 'blb.cpp', NULL, 0, 943, NULL, 'cannot read from new BLOB', NULL, NULL);
|
||||||
('dyn_no_create_priv', NULL, 'scl.epp', NULL, 0, 944, NULL, 'No permission for CREATE @1 operation', NULL, NULL);
|
('dyn_no_create_priv', NULL, 'scl.epp', NULL, 0, 944, NULL, 'No permission for CREATE @1 operation', NULL, NULL);
|
||||||
('suspend_without_returns', NULL, 'StmtNodes.cpp', NULL, 0, 945, NULL, 'SUSPEND could not be used without RETURNS clause in PROCEDURE or EXECUTE BLOCK', NULL, NULL);
|
('suspend_without_returns', NULL, 'StmtNodes.cpp', NULL, 0, 945, NULL, 'SUSPEND could not be used without RETURNS clause in PROCEDURE or EXECUTE BLOCK', NULL, NULL);
|
||||||
|
('truncate_warn', NULL, 'cvt.cpp', NULL, 0, 946, NULL, 'String truncated warning due to the following reason', NULL, NULL);
|
||||||
|
('truncate_monitor', NULL, 'Monitoring.cpp', NULL, 0, 947, NULL, 'Monitoring data does not fit into the field', NULL, NULL);
|
||||||
|
('truncate_context', NULL, 'SysFunction.cpp', NULL, 0, 948, NULL, 'Engine data does not fit into return value of system function', NULL, NULL);
|
||||||
-- QLI
|
-- QLI
|
||||||
(NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL);
|
(NULL, NULL, NULL, NULL, 1, 0, NULL, 'expected type', NULL, NULL);
|
||||||
(NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL);
|
(NULL, NULL, NULL, NULL, 1, 1, NULL, 'bad block type', NULL, NULL);
|
||||||
@ -2507,7 +2510,7 @@ ERROR: Backup incomplete', NULL, NULL);
|
|||||||
('gbak_max_dbkey_length', 'update_view_dbkey_lengths', 'restore.epp', NULL, 12, 340, NULL, 'value greater than @1 when calculating length of rdb$db_key for view @2', NULL, NULL);
|
('gbak_max_dbkey_length', 'update_view_dbkey_lengths', 'restore.epp', NULL, 12, 340, NULL, 'value greater than @1 when calculating length of rdb$db_key for view @2', NULL, NULL);
|
||||||
('gbak_invalid_metadata', 'general_on_error', 'restore.epp', NULL, 12, 341, NULL, 'Invalid metadata detected. Use -FIX_FSS_METADATA option.', NULL, NULL);
|
('gbak_invalid_metadata', 'general_on_error', 'restore.epp', NULL, 12, 341, NULL, 'Invalid metadata detected. Use -FIX_FSS_METADATA option.', NULL, NULL);
|
||||||
('gbak_invalid_data', 'get_data', 'restore.epp', NULL, 12, 342, NULL, 'Invalid data detected. Use -FIX_FSS_DATA option.', NULL, NULL);
|
('gbak_invalid_data', 'get_data', 'restore.epp', NULL, 12, 342, NULL, 'Invalid data detected. Use -FIX_FSS_DATA option.', NULL, NULL);
|
||||||
(NULL, 'put_asciz', 'backup.epp', NULL, 12, 343, NULL, 'text for attribute @1 is too large in @2, truncating to @3 bytes', NULL, NULL);
|
(NULL, 'put_asciz', NULL, NULL, 12, 343, NULL, 'text for attribute @1 is too large in @2, truncating to @3 bytes', NULL, NULL);
|
||||||
('gbak_inv_bkup_ver2', 'restore.epp', 'burp.cpp', 'do not change the param order', 12, 344, NULL, 'Expected backup version @2..@3. Found @1', NULL, NULL);
|
('gbak_inv_bkup_ver2', 'restore.epp', 'burp.cpp', 'do not change the param order', 12, 344, NULL, 'Expected backup version @2..@3. Found @1', NULL, NULL);
|
||||||
(NULL, 'write_relations', 'backup.epp', NULL, 12, 345, NULL, ' writing view @1', NULL, NULL);
|
(NULL, 'write_relations', 'backup.epp', NULL, 12, 345, NULL, ' writing view @1', NULL, NULL);
|
||||||
(NULL, 'get_relation', 'restore.epp', NULL, 12, 346, NULL, ' table @1 is a view', NULL, NULL);
|
(NULL, 'get_relation', 'restore.epp', NULL, 12, 346, NULL, ' table @1 is a view', NULL, NULL);
|
||||||
|
@ -952,6 +952,9 @@ set bulk_insert INSERT INTO SYSTEM_ERRORS (SQL_CODE, SQL_CLASS, SQL_SUBCLASS, FA
|
|||||||
(-402, '42', '000', 0, 943, 'cannot_read_new_blob', NULL, NULL)
|
(-402, '42', '000', 0, 943, 'cannot_read_new_blob', NULL, NULL)
|
||||||
(-901, '42', '000', 0, 944, 'dyn_no_create_priv', NULL, NULL)
|
(-901, '42', '000', 0, 944, 'dyn_no_create_priv', NULL, NULL)
|
||||||
(-901, '42', '000', 0, 945, 'suspend_without_returns', NULL, NULL)
|
(-901, '42', '000', 0, 945, 'suspend_without_returns', NULL, NULL)
|
||||||
|
(304, '01', '004', 0, 946, 'truncate_warn', NULL, NULL)
|
||||||
|
(304, '01', '004', 0, 947, 'truncate_monitor', NULL, NULL)
|
||||||
|
(304, '01', '004', 0, 948, 'truncate_context', NULL, NULL)
|
||||||
-- GFIX
|
-- GFIX
|
||||||
(-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL)
|
(-901, '00', '000', 3, 1, 'gfix_db_name', NULL, NULL)
|
||||||
(-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL)
|
(-901, '00', '000', 3, 2, 'gfix_invalid_sw', NULL, NULL)
|
||||||
|
Loading…
Reference in New Issue
Block a user