mirror of
https://github.com/chaisql/chai.git
synced 2025-10-30 10:26:59 +08:00
95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
package parser
|
|
|
|
import (
|
|
"github.com/cockroachdb/errors"
|
|
|
|
"github.com/chaisql/chai/internal/query/statement"
|
|
"github.com/chaisql/chai/internal/sql/scanner"
|
|
)
|
|
|
|
// parseDropStatement parses a drop string and returns a Statement AST row.
|
|
func (p *Parser) parseDropStatement() (statement.Statement, error) {
|
|
// Parse "DROP".
|
|
if err := p.ParseTokens(scanner.DROP); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
tok, pos, lit := p.ScanIgnoreWhitespace()
|
|
switch tok {
|
|
case scanner.TABLE:
|
|
return p.parseDropTableStatement()
|
|
case scanner.INDEX:
|
|
return p.parseDropIndexStatement()
|
|
case scanner.SEQUENCE:
|
|
return p.parseDropSequenceStatement()
|
|
}
|
|
|
|
return nil, newParseError(scanner.Tokstr(tok, lit), []string{"TABLE", "INDEX", "SEQUENCE"}, pos)
|
|
}
|
|
|
|
// parseDropTableStatement parses a drop table string and returns a Statement AST row.
|
|
// This function assumes the DROP TABLE tokens have already been consumed.
|
|
func (p *Parser) parseDropTableStatement() (statement.DropTableStmt, error) {
|
|
var stmt statement.DropTableStmt
|
|
var err error
|
|
|
|
stmt.IfExists, err = p.parseOptional(scanner.IF, scanner.EXISTS)
|
|
if err != nil {
|
|
return stmt, err
|
|
}
|
|
|
|
// Parse table name
|
|
stmt.TableName, err = p.parseIdent()
|
|
if err != nil {
|
|
pErr := errors.Unwrap(err).(*ParseError)
|
|
pErr.Expected = []string{"table_name"}
|
|
return stmt, pErr
|
|
}
|
|
|
|
return stmt, nil
|
|
}
|
|
|
|
// parseDropIndexStatement parses a drop index string and returns a Statement AST row.
|
|
// This function assumes the DROP INDEX tokens have already been consumed.
|
|
func (p *Parser) parseDropIndexStatement() (statement.DropIndexStmt, error) {
|
|
var stmt statement.DropIndexStmt
|
|
var err error
|
|
|
|
stmt.IfExists, err = p.parseOptional(scanner.IF, scanner.EXISTS)
|
|
if err != nil {
|
|
return stmt, err
|
|
}
|
|
|
|
// Parse index name
|
|
stmt.IndexName, err = p.parseIdent()
|
|
if err != nil {
|
|
pErr := errors.Unwrap(err).(*ParseError)
|
|
pErr.Expected = []string{"index_name"}
|
|
return stmt, pErr
|
|
}
|
|
|
|
return stmt, nil
|
|
}
|
|
|
|
// parseDropSequenceStatement parses a drop sequence string and returns a Statement AST row.
|
|
// This function assumes the DROP SEQUENCE tokens have already been consumed.
|
|
func (p *Parser) parseDropSequenceStatement() (statement.DropSequenceStmt, error) {
|
|
var stmt statement.DropSequenceStmt
|
|
var err error
|
|
|
|
stmt.IfExists, err = p.parseOptional(scanner.IF, scanner.EXISTS)
|
|
if err != nil {
|
|
return stmt, err
|
|
}
|
|
|
|
// Parse sequence name
|
|
stmt.SequenceName, err = p.parseIdent()
|
|
if err != nil {
|
|
pErr := errors.Unwrap(err).(*ParseError)
|
|
pErr.Expected = []string{"sequence_name"}
|
|
return stmt, pErr
|
|
}
|
|
|
|
return stmt, nil
|
|
}
|