diff --git a/q/parse.go b/q/parse.go index ea54a93..aab700f 100644 --- a/q/parse.go +++ b/q/parse.go @@ -136,6 +136,11 @@ func findQueryType(p *parser) (string, error) { func parseSelectStatement(p *parser) error { selectQuery := p.query.(*Select) + distinctErr := parseDistinct(p) + if distinctErr != nil { + return distinctErr + } + foundWildcard, _ := p.findToken(func(t Token) bool { return t.Type == sqllexer.WILDCARD }) @@ -170,6 +175,20 @@ func parseSelectStatement(p *parser) error { return nil } +func parseDistinct(p *parser) error { + selectQuery := p.query.(*Select) + + foundDistinctKeyword, _ := p.findToken(func(t Token) bool { + return t.Type == sqllexer.KEYWORD && strings.ToUpper(t.Value) == "DISTINCT" + }) + + if foundDistinctKeyword != nil { + selectQuery.IsDistinct = true + } + + return nil +} + func parseSelectColumns(p *parser) error { selectQuery := p.query.(*Select) diff --git a/q/parse_test.go b/q/parse_test.go index 94ef266..98fb027 100644 --- a/q/parse_test.go +++ b/q/parse_test.go @@ -43,6 +43,23 @@ func TestParseSelectStatement_StateMachine(t *testing.T) { }, }, }, + { + input: "SELECT DISTINCT username, email FROM users", + expected: &Select{ + Type: SELECT, + IsDistinct: true, + Table: Table{Name: "users"}, + IsWildcard: false, + Columns: []Column{ + { + Name: "username", + }, + { + Name: "email", + }, + }, + }, + }, { input: "SELECT CustomerName AS Customer, City AS town FROM Customers AS People", expected: &Select{ @@ -229,6 +246,9 @@ func TestParseSelectStatement_StateMachine(t *testing.T) { if answerAsSelect.Table.Alias != expected.Table.Alias { t.Errorf("got %s for Select.Table.Alias, expected %s", answerAsSelect.Table.Alias, expected.Table.Alias) } + if answerAsSelect.IsDistinct != expected.IsDistinct { + t.Errorf("got %v for Select.IsDistinct, expected %v", answerAsSelect.IsDistinct, expected.IsDistinct) + } if len(answerAsSelect.Columns) != len(expected.Columns) { t.Errorf("got %d number of columns for Select.Columns, expected %d", len(answerAsSelect.Columns), len(expected.Columns))