Files
chaisql/internal/sql/parser/delete.go
2021-05-30 12:47:17 +04:00

53 lines
1.1 KiB
Go

package parser
import (
"github.com/genjidb/genji/internal/query/statement"
"github.com/genjidb/genji/internal/sql/scanner"
)
// parseDeleteStatement parses a delete string and returns a Statement AST object.
// This function assumes the DELETE token has already been consumed.
func (p *Parser) parseDeleteStatement() (*statement.DeleteStmt, error) {
var stmt statement.DeleteStmt
var err error
// Parse "FROM".
if err := p.parseTokens(scanner.FROM); err != nil {
return nil, err
}
// Parse table name
stmt.TableName, err = p.parseIdent()
if err != nil {
pErr := err.(*ParseError)
pErr.Expected = []string{"table_name"}
return nil, pErr
}
// Parse condition: "WHERE EXPR".
stmt.WhereExpr, err = p.parseCondition()
if err != nil {
return nil, err
}
// Parse order by: "ORDER BY path [ASC|DESC]?"
stmt.OrderBy, stmt.OrderByDirection, err = p.parseOrderBy()
if err != nil {
return nil, err
}
// Parse limit: "LIMIT expr"
stmt.LimitExpr, err = p.parseLimit()
if err != nil {
return nil, err
}
// Parse offset: "OFFSET expr"
stmt.OffsetExpr, err = p.parseOffset()
if err != nil {
return nil, err
}
return &stmt, nil
}