From e56dd20426f7a5843eb10f3dd86b248b1e84b530 Mon Sep 17 00:00:00 2001 From: yihong Date: Wed, 15 Jan 2025 14:42:24 +0800 Subject: [PATCH] fix: panic and interval when do not have keyword `interval` (#5339) * fix: panic and interval when do not have keyword Signed-off-by: yihong0618 * fix: wrong pos... Signed-off-by: yihong0618 * fix: address comments drop the unreachable Signed-off-by: yihong0618 * fix: address comments and add sqlness tests Signed-off-by: yihong0618 --------- Signed-off-by: yihong0618 --- src/sql/src/error.rs | 7 +++++++ src/sql/src/statements.rs | 18 +++++++++++++----- .../common/insert/insert_wrong_type.result | 19 +++++++++++++++++++ .../common/insert/insert_wrong_type.sql | 8 ++++++++ 4 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 tests/cases/standalone/common/insert/insert_wrong_type.result create mode 100644 tests/cases/standalone/common/insert/insert_wrong_type.sql diff --git a/src/sql/src/error.rs b/src/sql/src/error.rs index 09b8eb5cad..25cb6578de 100644 --- a/src/sql/src/error.rs +++ b/src/sql/src/error.rs @@ -132,6 +132,12 @@ pub enum Error { #[snafu(implicit)] location: Location, }, + #[snafu(display("ConcreteDataType not supported yet: {:?}", t))] + ConcreteTypeNotSupported { + t: ConcreteDataType, + #[snafu(implicit)] + location: Location, + }, #[snafu(display("Failed to parse value: {}", msg))] ParseSqlValue { @@ -355,6 +361,7 @@ impl ErrorExt for Error { | InvalidSql { .. } | ParseSqlValue { .. } | SqlTypeNotSupported { .. } + | ConcreteTypeNotSupported { .. } | UnexpectedToken { .. } | InvalidDefault { .. } => StatusCode::InvalidSyntax, diff --git a/src/sql/src/statements.rs b/src/sql/src/statements.rs index 90db401cba..fb24685e59 100644 --- a/src/sql/src/statements.rs +++ b/src/sql/src/statements.rs @@ -136,9 +136,10 @@ fn parse_string_to_value( let v = parse_string_to_vector_type_value(&s, Some(d.dim)).context(DatatypeSnafu)?; Ok(Value::Binary(v.into())) } - _ => { - unreachable!() + _ => ParseSqlValueSnafu { + msg: format!("Failed to parse {s} to {data_type} value"), } + .fail(), } } @@ -430,7 +431,13 @@ fn parse_column_default_constraint( } .fail(); } - _ => unreachable!(), + _ => { + return UnsupportedDefaultValueSnafu { + column_name, + expr: Expr::Value(SqlValue::Null), + } + .fail(); + } }; Ok(Some(default_constraint)) @@ -680,9 +687,10 @@ pub fn concrete_data_type_to_sql_data_type(data_type: &ConcreteDataType) -> Resu ConcreteDataType::Duration(_) | ConcreteDataType::Null(_) | ConcreteDataType::List(_) - | ConcreteDataType::Dictionary(_) => { - unreachable!() + | ConcreteDataType::Dictionary(_) => error::ConcreteTypeNotSupportedSnafu { + t: data_type.clone(), } + .fail(), } } diff --git a/tests/cases/standalone/common/insert/insert_wrong_type.result b/tests/cases/standalone/common/insert/insert_wrong_type.result new file mode 100644 index 0000000000..08768c3fb6 --- /dev/null +++ b/tests/cases/standalone/common/insert/insert_wrong_type.result @@ -0,0 +1,19 @@ +-- test for issue #3235 +CREATE TABLE b(i interval, ts timestamp time index); + +Affected Rows: 0 + +-- should fail +INSERT INTO b VALUES ('1 year', 1000); + +Error: 2000(InvalidSyntax), Failed to parse value: Failed to parse 1 year to IntervalMonthDayNano value + +-- success +INSERT INTO b VALUES (interval '1 year', 1000); + +Affected Rows: 1 + +DROP TABLE b; + +Affected Rows: 0 + diff --git a/tests/cases/standalone/common/insert/insert_wrong_type.sql b/tests/cases/standalone/common/insert/insert_wrong_type.sql new file mode 100644 index 0000000000..df3ab6bc83 --- /dev/null +++ b/tests/cases/standalone/common/insert/insert_wrong_type.sql @@ -0,0 +1,8 @@ +-- test for issue #3235 +CREATE TABLE b(i interval, ts timestamp time index); +-- should fail +INSERT INTO b VALUES ('1 year', 1000); +-- success +INSERT INTO b VALUES (interval '1 year', 1000); + +DROP TABLE b;