feat: parse IsDistinct
This commit is contained in:
parent
bc644c3640
commit
325f660a04
19
q/parse.go
19
q/parse.go
@ -136,6 +136,11 @@ func findQueryType(p *parser) (string, error) {
|
|||||||
func parseSelectStatement(p *parser) error {
|
func parseSelectStatement(p *parser) error {
|
||||||
selectQuery := p.query.(*Select)
|
selectQuery := p.query.(*Select)
|
||||||
|
|
||||||
|
distinctErr := parseDistinct(p)
|
||||||
|
if distinctErr != nil {
|
||||||
|
return distinctErr
|
||||||
|
}
|
||||||
|
|
||||||
foundWildcard, _ := p.findToken(func(t Token) bool {
|
foundWildcard, _ := p.findToken(func(t Token) bool {
|
||||||
return t.Type == sqllexer.WILDCARD
|
return t.Type == sqllexer.WILDCARD
|
||||||
})
|
})
|
||||||
@ -170,6 +175,20 @@ func parseSelectStatement(p *parser) error {
|
|||||||
return nil
|
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 {
|
func parseSelectColumns(p *parser) error {
|
||||||
selectQuery := p.query.(*Select)
|
selectQuery := p.query.(*Select)
|
||||||
|
|
||||||
|
@ -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",
|
input: "SELECT CustomerName AS Customer, City AS town FROM Customers AS People",
|
||||||
expected: &Select{
|
expected: &Select{
|
||||||
@ -229,6 +246,9 @@ func TestParseSelectStatement_StateMachine(t *testing.T) {
|
|||||||
if answerAsSelect.Table.Alias != expected.Table.Alias {
|
if answerAsSelect.Table.Alias != expected.Table.Alias {
|
||||||
t.Errorf("got %s for Select.Table.Alias, expected %s", 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) {
|
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))
|
t.Errorf("got %d number of columns for Select.Columns, expected %d", len(answerAsSelect.Columns), len(expected.Columns))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user