mirror of
https://github.com/chaisql/chai.git
synced 2025-10-30 10:26:59 +08:00
64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package parser
|
|
|
|
import (
|
|
"github.com/chaisql/chai/internal/query"
|
|
"github.com/chaisql/chai/internal/query/statement"
|
|
"github.com/chaisql/chai/internal/sql/scanner"
|
|
)
|
|
|
|
// parseBeginStatement parses a BEGIN statement.
|
|
func (p *Parser) parseBeginStatement() (statement.Statement, error) {
|
|
// Parse "BEGIN".
|
|
if err := p.ParseTokens(scanner.BEGIN); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// parse optional TRANSACTION token
|
|
_, _ = p.parseOptional(scanner.TRANSACTION)
|
|
|
|
// parse optional READ token
|
|
if tok, _, _ := p.ScanIgnoreWhitespace(); tok != scanner.READ {
|
|
p.Unscan()
|
|
return query.BeginStmt{Writable: true}, nil
|
|
}
|
|
|
|
// parse ONLY token
|
|
if tok, _, _ := p.ScanIgnoreWhitespace(); tok == scanner.ONLY {
|
|
return query.BeginStmt{Writable: false}, nil
|
|
}
|
|
|
|
p.Unscan()
|
|
|
|
// parse WRITE token
|
|
if tok, pos, lit := p.ScanIgnoreWhitespace(); tok != scanner.WRITE {
|
|
return query.BeginStmt{}, newParseError(scanner.Tokstr(tok, lit), []string{"ONLY", "WRITE"}, pos)
|
|
}
|
|
|
|
return query.BeginStmt{Writable: true}, nil
|
|
}
|
|
|
|
// parseRollbackStatement parses a ROLLBACK statement.
|
|
func (p *Parser) parseRollbackStatement() (statement.Statement, error) {
|
|
// Parse "ROLLBACK".
|
|
if err := p.ParseTokens(scanner.ROLLBACK); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// parse optional TRANSACTION token
|
|
_, _ = p.parseOptional(scanner.TRANSACTION)
|
|
|
|
return query.RollbackStmt{}, nil
|
|
}
|
|
|
|
// parseCommitStatement parses a COMMIT statement.
|
|
func (p *Parser) parseCommitStatement() (statement.Statement, error) {
|
|
// Parse "COMMIT".
|
|
if err := p.ParseTokens(scanner.COMMIT); err != nil {
|
|
return nil, err
|
|
}
|
|
// parse optional TRANSACTION token
|
|
_, _ = p.parseOptional(scanner.TRANSACTION)
|
|
|
|
return query.CommitStmt{}, nil
|
|
}
|