mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-02 10:40:38 +01:00
Fixed CORE-4258 - Wrong boundary for minimum value for BIGINT/DECIMAL(18).
This commit is contained in:
parent
5453b5c394
commit
08e6588fcd
@ -1472,8 +1472,9 @@ private:
|
||||
|
||||
struct ScaledNumber
|
||||
{
|
||||
SINT64 number;
|
||||
FB_UINT64 number;
|
||||
SCHAR scale;
|
||||
bool hex;
|
||||
};
|
||||
|
||||
|
||||
|
@ -755,6 +755,7 @@ int Parser::yylexAux()
|
||||
|
||||
yylval.scaledNumber.number = 0;
|
||||
yylval.scaledNumber.scale = 0;
|
||||
yylval.scaledNumber.hex = true;
|
||||
|
||||
while (*p)
|
||||
{
|
||||
@ -992,6 +993,7 @@ int Parser::yylexAux()
|
||||
|
||||
yylval.scaledNumber.number = number;
|
||||
yylval.scaledNumber.scale = scale;
|
||||
yylval.scaledNumber.hex = false;
|
||||
|
||||
if (have_decimal)
|
||||
return SCALEDINT;
|
||||
|
@ -1525,8 +1525,29 @@ set_generator_clause
|
||||
%type <int64Val> sequence_value
|
||||
sequence_value
|
||||
: signed_long_integer { $$ = $1; }
|
||||
| NUMBER64BIT { $$ = $1.number; }
|
||||
| '-' NUMBER64BIT { $$ = -$2.number; }
|
||||
| NUMBER64BIT
|
||||
{
|
||||
SINT64 signedNumber = (SINT64) $1.number;
|
||||
|
||||
if (!$1.hex && $1.number > MAX_SINT64)
|
||||
{
|
||||
ERRD_post(
|
||||
Arg::Gds(isc_sqlerr) << Arg::Num(-104) <<
|
||||
Arg::Gds(isc_arith_except) <<
|
||||
Arg::Gds(isc_numeric_out_of_range));
|
||||
}
|
||||
|
||||
$$ = signedNumber;
|
||||
}
|
||||
| '-' NUMBER64BIT
|
||||
{
|
||||
SINT64 signedNumber = (SINT64) $2.number;
|
||||
|
||||
if ($2.hex && signedNumber == MIN_SINT64)
|
||||
ERRD_post(Arg::Gds(isc_exception_integer_overflow));
|
||||
|
||||
$$ = -signedNumber;
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
@ -6020,13 +6041,15 @@ u_numeric_constant
|
||||
{ $$ = MAKE_constant($1->c_str(), CONSTANT_DOUBLE); }
|
||||
| NUMBER64BIT
|
||||
{
|
||||
if ($1.number >= 0)
|
||||
$$ = MAKE_const_sint64($1.number, $1.scale);
|
||||
SINT64 signedNumber = (SINT64) $1.number;
|
||||
|
||||
if ($1.hex && signedNumber < 0)
|
||||
$$ = newNode<NegateNode>(MAKE_const_sint64(-signedNumber, $1.scale));
|
||||
else
|
||||
$$ = newNode<NegateNode>(MAKE_const_sint64(-$1.number, $1.scale));
|
||||
$$ = MAKE_const_sint64(signedNumber, $1.scale);
|
||||
}
|
||||
| SCALEDINT
|
||||
{ $$ = MAKE_const_sint64($1.number, $1.scale); }
|
||||
{ $$ = MAKE_const_sint64((SINT64) $1.number, $1.scale); }
|
||||
;
|
||||
|
||||
%type <valueExprNode> u_constant
|
||||
|
Loading…
Reference in New Issue
Block a user