Skip to content

Commit 4e539de

Browse files
authored
Fix query validation to ensure we use actual query value (#50)
This PR fixes the situation where original query sent by the user was converted to lower case. We now lower case the query for validation only. Then pass on the actual query to datafusion. Fixes #47
1 parent b24b7a0 commit 4e539de

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

server/src/error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ pub enum Error {
6262
MultipleStreams(String),
6363
#[error("start time can not be later than end time")]
6464
StartTimeAfterEndTime(),
65-
#[error("query is incomplete")]
66-
IncompleteQuery(),
65+
#[error("query '{0}' is incomplete")]
66+
IncompleteQuery(String),
6767
#[error("query cannot be empty")]
6868
EmptyQuery,
6969
#[error("start time cannot be empty in query")]

server/src/query.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,11 @@ impl Query {
5252
// this query is supposed to be executed
5353
pub fn parse(query_json: Value) -> Result<Query, Error> {
5454
// retrieve query, start and end time information from payload.
55-
// Convert query to lowercase.
56-
let query = get_value(&query_json, "query")?.to_lowercase();
55+
let query = get_value(&query_json, "query")?;
5756
let start_time = get_value(&query_json, "startTime")?;
5857
let end_time = get_value(&query_json, "endTime")?;
5958

60-
validator::query(&query, start_time, end_time)
59+
validator::query(query, start_time, end_time)
6160
}
6261

6362
/// Return prefixes, each per day/hour/minutes as necessary

server/src/validator.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,17 @@ pub fn query(query: &str, start_time: &str, end_time: &str) -> Result<Query, Err
132132
return Err(Error::EmptyQuery);
133133
}
134134

135-
let tokens = query.split(' ').collect::<Vec<&str>>();
135+
// convert query to lower case for validation only
136+
// if validation succeeds, we use the original query
137+
// since table names/fields are case sensitive
138+
let query_lower = query.to_lowercase();
139+
140+
let tokens = query_lower.split(' ').collect::<Vec<&str>>();
136141
if tokens.contains(&"join") {
137142
return Err(Error::Join(query.to_string()));
138143
}
139144
if tokens.len() < 4 {
140-
return Err(Error::IncompleteQuery());
145+
return Err(Error::IncompleteQuery(query.to_string()));
141146
}
142147
if start_time.is_empty() {
143148
return Err(Error::EmptyStartTime);
@@ -151,7 +156,7 @@ pub fn query(query: &str, start_time: &str, end_time: &str) -> Result<Query, Err
151156
// we currently don't support queries like "select name, address from stream1 and stream2"
152157
// so if there is an `and` after the first log stream name, we return an error.
153158
if tokens.len() > stream_name_index + 1 && tokens[stream_name_index + 1] == "and" {
154-
return Err(Error::MultipleStreams(query.to_owned()));
159+
return Err(Error::MultipleStreams(query.to_string()));
155160
}
156161

157162
let start: DateTime<Utc> = DateTime::parse_from_rfc3339(start_time)?.into();

0 commit comments

Comments
 (0)