diff --git a/src/parser/parser_test.go b/src/parser/parser_test.go index 096d8e3285..3d8decaf21 100644 --- a/src/parser/parser_test.go +++ b/src/parser/parser_test.go @@ -178,6 +178,14 @@ func (self *QueryParserSuite) TestParseDeleteQuery(c *C) { c.Assert(q.GetEndTime(), Equals, endTime) } +func (self *QueryParserSuite) TestInvalidWhereClause(c *C) { + _, err := ParseQuery("delete from foo where 1;") + c.Assert(err, NotNil) + + _, err = ParseQuery("select * from foo where is_uppercase(name);") + c.Assert(err, IsNil) +} + func (self *QueryParserSuite) TestParseWithUnderscore(c *C) { queryString := "select _value, time, sequence_number from foo" query, err := ParseSelectQuery(queryString) diff --git a/src/parser/query_api.go b/src/parser/query_api.go index f1f3275379..3636ac5638 100644 --- a/src/parser/query_api.go +++ b/src/parser/query_api.go @@ -375,6 +375,15 @@ func getTime(condition *WhereCondition, isParsingStartTime bool) (*WhereConditio } if expr, ok := condition.GetBoolExpression(); ok { + switch expr.Type { + case ValueDuration, ValueFloat, ValueInt, ValueString, ValueWildcard: + return nil, ZERO_TIME, fmt.Errorf("Invalid where expression: %v", expr) + } + + if expr.Type == ValueFunctionCall { + return condition, ZERO_TIME, nil + } + leftValue := expr.Elems[0] isTimeOnLeft := leftValue.Type != ValueExpression && leftValue.Type != ValueFunctionCall rightValue := expr.Elems[1]