我们接上节内容继续完成SQL解释器的代码解析工作。下面我们实现对update语句的解析,其语法如下:
UpdateCmd -> INSERT | DELETE | MODIFY | CREATE
Create -> CreateTable | CreateView | CreateIndex
Insert -> INSERT INTO ID LEFT_PARAS FieldList RIGHT_PARAS VALUES LEFT_PARS ConstList RIGHT_PARAS
FieldList -> Field ( COMMA FieldList)?
ConstList -> Constant ( COMMA ConstList)?
Delete -> DELETE FROM ID [WHERE Predicate)?
Modify -> UPDATE ID SET Field ASSIGN_OPERATOR Expression (WHERE Predicate)?
CreateTable -> CREATE TABLE ID (FieldDefs)?
FieldDefs -> FieldDef ( COMMA FieldDefs)?
FieldDef -> ID TypeDef
TypeDef -> INT | VARCHAT LEFT_PARAS NUM RIGHT_PARAS
CreateView -> CREATE VIEW ID AS Query
CreateIndex -> CREATE INDEX ID ON ID LEFT_PARAS Field RIGHT_PARAS
我们对上面的语法做一些基本说明:
UpdateCmd -> INSERT | DELETE | MODIFY | CREATE
这句语法表明SQL语言中用于更新表的语句一定由insert, delete, modify , create等几个命令开始。insert 语句由关键字insert开始,然后跟着insert into两个关键字,接着是左括号,跟着是由列名(column)组成的字符串,他们之间由逗号隔开,然后跟着右括号,接着是关键字VALUES,然后是左括号,接着是一系列常量和逗号组成的序列,最后以又括号结尾,其他语法大家可以参照SQL相关命令来理解,下面我们看看代码的实现,继续在parser.go中添加如下代码:
func (p *SQLParser) UpdateCmd() interface{
} {
tok, err := p.sqlLexer.Scan()
if err != nil {
panic(err)
}
if tok.Tag == lexer.INSERT {
p.sqlLexer.ReverseScan()
return p.Insert()
} else if tok.Tag == lexer.DELETE {
p.sqlLexer.ReverseScan()
return p.Delete()
} else if tok.Tag == lexer.UPDATE {
p.sqlLexer.ReverseScan()
return p.Update()
} else {
p.sqlLexer.ReverseScan()
return p.Create()
}
}
func (p *SQLParser) Create() interface{
} {
tok, err := p.sqlLexer.Scan()
if err != nil {
panic(err)
}
if tok.Tag != lexer.CREATE {
panic("token is not create")
}
tok, err = p.sqlLexer.Scan()
if err != nil {
panic(err)
}
if tok.Tag == lexer.TABLE {
return p.CreateTable()
} else if tok.Tag == lexer.VIEW {
return p.CreateView()
} else {
return p.CreateIndex()
}
}
func (p *SQLParser) CreateView() interface{
} {
return nil
}
func (p *SQLParser) CreateIndex