From cc7f33c90cabb63c1e399a84d734023a3d917205 Mon Sep 17 00:00:00 2001 From: Ruihang Xia Date: Sun, 4 Aug 2024 04:58:53 +0800 Subject: [PATCH] fix(tql): avoid unwrap on parsing tql query (#4502) * fix(tql): avoid unwrap on parsing tql query Signed-off-by: Ruihang Xia * add unit test Signed-off-by: Ruihang Xia --------- Signed-off-by: Ruihang Xia --- src/sql/src/parsers/error.rs | 8 ++++++++ src/sql/src/parsers/tql_parser.rs | 10 +++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/sql/src/parsers/error.rs b/src/sql/src/parsers/error.rs index 8feb80b988..c591701ab3 100644 --- a/src/sql/src/parsers/error.rs +++ b/src/sql/src/parsers/error.rs @@ -31,4 +31,12 @@ pub enum TQLError { #[snafu(display("Failed to evaluate TQL expression: {}", msg))] Evaluation { msg: String }, + + #[snafu(display("Failed to convert TQL expression to logical expression"))] + ConvertToLogicalExpression { + #[snafu(source)] + error: Box, + #[snafu(implicit)] + location: Location, + }, } diff --git a/src/sql/src/parsers/tql_parser.rs b/src/sql/src/parsers/tql_parser.rs index 985f66720b..078cf0f726 100644 --- a/src/sql/src/parsers/tql_parser.rs +++ b/src/sql/src/parsers/tql_parser.rs @@ -31,6 +31,7 @@ const VERBOSE: &str = "VERBOSE"; use sqlparser::parser::Parser; +use super::error::ConvertToLogicalExpressionSnafu; use crate::dialect::GreptimeDbDialect; use crate::parsers::error::{EvaluationSnafu, ParserSnafu, TQLError}; @@ -182,7 +183,9 @@ impl<'a> ParserContext<'a> { fn parse_tokens(tokens: Vec) -> std::result::Result { let parser_expr = Self::parse_to_expr(tokens)?; - let lit = utils::parser_expr_to_scalar_value(parser_expr).unwrap(); + let lit = utils::parser_expr_to_scalar_value(parser_expr) + .map_err(Box::new) + .context(ConvertToLogicalExpressionSnafu)?; let second = match lit { ScalarValue::TimestampNanosecond(ts_nanos, _) @@ -270,6 +273,11 @@ mod tests { } _ => unreachable!(), } + + let sql = "TQL EVAL (now(), now()-'5m', '30s') http_requests_total"; + let result = + ParserContext::create_with_dialect(sql, &GreptimeDbDialect {}, ParseOptions::default()); + assert!(result.is_err()); } #[test]