fix(tql): avoid unwrap on parsing tql query (#4502)

* fix(tql): avoid unwrap on parsing tql query

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

* add unit test

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>

---------

Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
This commit is contained in:
Ruihang Xia
2024-08-04 04:58:53 +08:00
committed by GitHub
parent fe1cfbf2b3
commit cc7f33c90c
2 changed files with 17 additions and 1 deletions
+8
View File
@@ -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<crate::error::Error>,
#[snafu(implicit)]
location: Location,
},
}
+9 -1
View File
@@ -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<Token>) -> std::result::Result<String, TQLError> {
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]