From 007b63dd9d1d15b332939190dd7bd471f72a13c6 Mon Sep 17 00:00:00 2001 From: Weny Xu Date: Tue, 23 Jan 2024 12:33:13 +0900 Subject: [PATCH] fix: fix default value cannot accept negative number (#3217) * fix: fix default value cannot accept negative number * chore: apply suggestions from CR --- src/sql/src/statements.rs | 12 ++++++++++- .../standalone/common/create/create.result | 17 ++++++++++++++++ .../cases/standalone/common/create/create.sql | 5 +++++ .../standalone/common/insert/insert.result | 20 +++++++++++++++++++ .../cases/standalone/common/insert/insert.sql | 8 ++++++++ 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/src/sql/src/statements.rs b/src/sql/src/statements.rs index 724c4cc422..df9df9a02b 100644 --- a/src/sql/src/statements.rs +++ b/src/sql/src/statements.rs @@ -44,7 +44,7 @@ use datatypes::types::{cast, TimestampType}; use datatypes::value::{OrderedF32, OrderedF64, Value}; pub use option_map::OptionMap; use snafu::{ensure, OptionExt, ResultExt}; -use sqlparser::ast::ExactNumberInfo; +use sqlparser::ast::{ExactNumberInfo, UnaryOperator}; pub use transform::{get_data_type_by_alias_name, transform_statements}; use crate::ast::{ @@ -302,6 +302,16 @@ fn parse_column_default_constraint( ColumnDefaultConstraint::Function(func.to_lowercase()) } ColumnOption::Default(expr) => { + if let Expr::UnaryOp { op, expr } = expr { + 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}"), + )?))); + } + } return UnsupportedDefaultValueSnafu { column_name, expr: expr.clone(), diff --git a/tests/cases/standalone/common/create/create.result b/tests/cases/standalone/common/create/create.result index 436cbfb393..53cb8bbba0 100644 --- a/tests/cases/standalone/common/create/create.result +++ b/tests/cases/standalone/common/create/create.result @@ -126,3 +126,20 @@ CREATE TABLE test_multiple_inline_pk_definitions ("timestamp" TIMESTAMP TIME IND Error: 1004(InvalidArguments), Illegal primary keys definition: not allowed to inline multiple primary keys in columns options +CREATE TABLE neg_default_value(i INT DEFAULT -1024, ts TIMESTAMP TIME INDEX); + +Affected Rows: 0 + +desc TABLE neg_default_value; + ++--------+----------------------+-----+------+---------+---------------+ +| Column | Type | Key | Null | Default | Semantic Type | ++--------+----------------------+-----+------+---------+---------------+ +| i | Int32 | | YES | -1024 | FIELD | +| ts | TimestampMillisecond | PRI | NO | | TIMESTAMP | ++--------+----------------------+-----+------+---------+---------------+ + +DROP TABLE neg_default_value; + +Affected Rows: 0 + diff --git a/tests/cases/standalone/common/create/create.sql b/tests/cases/standalone/common/create/create.sql index e350ef84ed..47d95c46d7 100644 --- a/tests/cases/standalone/common/create/create.sql +++ b/tests/cases/standalone/common/create/create.sql @@ -52,3 +52,8 @@ CREATE TABLE test_multiple_pk_definitions ("timestamp" TIMESTAMP TIME INDEX, hos CREATE TABLE test_multiple_inline_pk_definitions ("timestamp" TIMESTAMP TIME INDEX, host STRING PRIMARY KEY, "value" DOUBLE PRIMARY KEY); +CREATE TABLE neg_default_value(i INT DEFAULT -1024, ts TIMESTAMP TIME INDEX); + +desc TABLE neg_default_value; + +DROP TABLE neg_default_value; diff --git a/tests/cases/standalone/common/insert/insert.result b/tests/cases/standalone/common/insert/insert.result index d862eef762..6c6f78bc78 100644 --- a/tests/cases/standalone/common/insert/insert.result +++ b/tests/cases/standalone/common/insert/insert.result @@ -46,3 +46,23 @@ DROP TABLE presentations; Affected Rows: 0 +CREATE TABLE neg_default_value(i INT DEFAULT -1024, ts TIMESTAMP TIME INDEX); + +Affected Rows: 0 + +INSERT INTO neg_default_value(ts) values ('2000-01-01 00:00:00+00:00'); + +Affected Rows: 1 + +SELECT * FROM neg_default_value; + ++-------+---------------------+ +| i | ts | ++-------+---------------------+ +| -1024 | 2000-01-01T00:00:00 | ++-------+---------------------+ + +DROP TABLE neg_default_value; + +Affected Rows: 0 + diff --git a/tests/cases/standalone/common/insert/insert.sql b/tests/cases/standalone/common/insert/insert.sql index 27c65137cf..0b51181561 100644 --- a/tests/cases/standalone/common/insert/insert.sql +++ b/tests/cases/standalone/common/insert/insert.sql @@ -23,3 +23,11 @@ insert into presentations values (1, 'Patrick Damme', 'Analytical Query Processi DROP TABLE integers; DROP TABLE presentations; + +CREATE TABLE neg_default_value(i INT DEFAULT -1024, ts TIMESTAMP TIME INDEX); + +INSERT INTO neg_default_value(ts) values ('2000-01-01 00:00:00+00:00'); + +SELECT * FROM neg_default_value; + +DROP TABLE neg_default_value;