Handle special case -9223372036854775808 and prevent conversion to Real

This commit is contained in:
krishvishal
2025-01-29 15:13:57 +05:30
parent ad8e05b9a1
commit a4a1ff2b6d

View File

@@ -1768,22 +1768,33 @@ pub fn translate_expr(
UnaryOperator::Negative | UnaryOperator::Positive,
ast::Expr::Literal(ast::Literal::Numeric(numeric_value)),
) => {
let maybe_int = numeric_value.parse::<i64>();
let multiplier = if let UnaryOperator::Negative = op {
-1
} else {
1
};
if let Ok(value) = maybe_int {
// Special case: if we're negating "9223372036854775808", this is exactly MIN_INT64
// If we don't do this -1 * 9223372036854775808 will overflow and parse will fail and trigger conversion to Real.
if multiplier == -1 && numeric_value == "9223372036854775808" {
program.emit_insn(Insn::Integer {
value: value * multiplier,
value: i64::MIN,
dest: target_register,
});
} else {
program.emit_insn(Insn::Real {
value: multiplier as f64 * numeric_value.parse::<f64>()?,
dest: target_register,
});
let maybe_int = numeric_value.parse::<i64>();
if let Ok(value) = maybe_int {
program.emit_insn(Insn::Integer {
value: value * multiplier,
dest: target_register,
});
} else {
let value = numeric_value.parse::<f64>()?;
program.emit_insn(Insn::Real {
value: value * multiplier as f64,
dest: target_register,
});
}
}
Ok(target_register)
}