fix: overflow when parsing default value with negative numbers (#4459)

* fix: overflow when parsing default value with negative numbers

* test: adds sqlness test
This commit is contained in:
dennis zhuang
2024-07-31 00:41:49 -07:00
committed by GitHub
parent b741a7181b
commit 656050722c
3 changed files with 58 additions and 0 deletions

View File

@@ -371,7 +371,20 @@ fn parse_column_default_constraint(
// Always use lowercase for function expression
ColumnDefaultConstraint::Function(func.to_lowercase())
}
ColumnOption::Default(Expr::UnaryOp { op, expr }) => {
// Specialized process for handling numerical inputs to prevent
// overflow errors during the parsing of negative numbers,
// See https://github.com/GreptimeTeam/greptimedb/issues/4351
if let (UnaryOperator::Minus, Expr::Value(SqlValue::Number(n, _))) =
(op, expr.as_ref())
{
return Ok(Some(ColumnDefaultConstraint::Value(sql_number_to_value(
data_type,
&format!("-{n}"),
)?)));
}
if let Expr::Value(v) = &**expr {
let value = sql_value_to_value(column_name, data_type, v, timezone, Some(*op))?;
ColumnDefaultConstraint::Value(value)
@@ -1050,6 +1063,28 @@ mod tests {
constraint,
Some(ColumnDefaultConstraint::Value(Value::Boolean(true)))
);
// Test negative number
let opts = vec![ColumnOptionDef {
name: None,
option: ColumnOption::Default(Expr::UnaryOp {
op: UnaryOperator::Minus,
expr: Box::new(Expr::Value(SqlValue::Number("32768".to_string(), false))),
}),
}];
let constraint = parse_column_default_constraint(
"coll",
&ConcreteDataType::int16_datatype(),
&opts,
None,
)
.unwrap();
assert_matches!(
constraint,
Some(ColumnDefaultConstraint::Value(Value::Int16(-32768)))
);
}
#[test]

View File

@@ -54,6 +54,23 @@ CREATE TABLE 'N.~' (i TIMESTAMP TIME INDEX);
Error: 1004(InvalidArguments), Invalid table name: N.~
CREATE TABLE neg_default_value_min(i TIMESTAMP TIME INDEX, j SMALLINT DEFAULT -32768);
Affected Rows: 0
DESC TABLE neg_default_value_min;
+--------+----------------------+-----+------+---------+---------------+
| Column | Type | Key | Null | Default | Semantic Type |
+--------+----------------------+-----+------+---------+---------------+
| i | TimestampMillisecond | PRI | NO | | TIMESTAMP |
| j | Int16 | | YES | -32768 | FIELD |
+--------+----------------------+-----+------+---------+---------------+
DROP TABLE neg_default_value_min;
Affected Rows: 0
DESC TABLE integers;
+--------+----------------------+-----+------+---------+---------------+

View File

@@ -26,6 +26,12 @@ CREATE TABLE test2 (i INTEGER, j TIMESTAMP TIME INDEX);
CREATE TABLE 'N.~' (i TIMESTAMP TIME INDEX);
CREATE TABLE neg_default_value_min(i TIMESTAMP TIME INDEX, j SMALLINT DEFAULT -32768);
DESC TABLE neg_default_value_min;
DROP TABLE neg_default_value_min;
DESC TABLE integers;
DESC TABLE test1;