8
0
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:
asfernandes 2013-11-13 15:46:10 +00:00
parent 5453b5c394
commit 08e6588fcd
3 changed files with 33 additions and 7 deletions

View File

@ -1472,8 +1472,9 @@ private:
struct ScaledNumber
{
SINT64 number;
FB_UINT64 number;
SCHAR scale;
bool hex;
};

View File

@ -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;

View File

@ -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