Add working tview, add working load ond Tables, remove giu
This commit is contained in:
25
sql/lexer.go
25
sql/lexer.go
@@ -19,11 +19,21 @@ const (
|
||||
LPAREN
|
||||
RPAREN
|
||||
COMMA
|
||||
ASTERIKS
|
||||
ASSIGN
|
||||
|
||||
// Keywords
|
||||
CREATE
|
||||
TABLE
|
||||
|
||||
SELECT
|
||||
FROM
|
||||
WHERE
|
||||
AND
|
||||
OR
|
||||
ORDER
|
||||
TOP
|
||||
|
||||
PRIMARY
|
||||
FOREIGN
|
||||
REFERENCES
|
||||
@@ -35,6 +45,8 @@ const (
|
||||
TEXT
|
||||
INTEGER
|
||||
NULL
|
||||
REAL
|
||||
BLOB
|
||||
)
|
||||
|
||||
var keywords map[string]Token = map[string]Token{
|
||||
@@ -50,6 +62,15 @@ var keywords map[string]Token = map[string]Token{
|
||||
"NULL": NULL,
|
||||
"IF": IF,
|
||||
"EXISTS": EXISTS,
|
||||
"SELECT": SELECT,
|
||||
"FROM": FROM,
|
||||
"WHERE": WHERE,
|
||||
"AND": AND,
|
||||
"OR": OR,
|
||||
"ORDER": ORDER,
|
||||
"TOP": TOP,
|
||||
"REAL": REAL,
|
||||
"BLOB": BLOB,
|
||||
}
|
||||
|
||||
type Position struct {
|
||||
@@ -91,6 +112,10 @@ func (l *Lexer) Lex() (Position, Token, string) {
|
||||
return l.pos, LPAREN, "("
|
||||
case ')':
|
||||
return l.pos, RPAREN, ")"
|
||||
case '*':
|
||||
return l.pos, ASTERIKS, "*"
|
||||
case '=':
|
||||
return l.pos, ASSIGN, "="
|
||||
default:
|
||||
if unicode.IsSpace(r) {
|
||||
continue
|
||||
|
||||
@@ -39,7 +39,7 @@ func (p *Parser) Parse() (Statement, error) {
|
||||
return nil, p.unexpectedToken(IDENT, IF)
|
||||
} else if tok == IF && !p.expectSequence(NOT, EXISTS, IDENT) {
|
||||
return nil, p.unexpectedToken()
|
||||
}
|
||||
}
|
||||
_, _, lit := p.rescan()
|
||||
|
||||
stmt := CreateTableStatement{
|
||||
@@ -89,6 +89,38 @@ func (p *Parser) Parse() (Statement, error) {
|
||||
|
||||
stmt.Columns[column].Extra = append(stmt.Columns[column].Extra, ref)
|
||||
|
||||
case PRIMARY:
|
||||
if !p.expectSequence(KEY, LPAREN, IDENT) {
|
||||
return nil, p.unexpectedToken()
|
||||
}
|
||||
primaryKeyNames := make([]string, 0)
|
||||
_, _, columnName := p.rescan()
|
||||
primaryKeyNames = append(primaryKeyNames, columnName)
|
||||
|
||||
for {
|
||||
tok, ok := p.expectOne(RPAREN, COMMA)
|
||||
if !ok {
|
||||
return nil, p.unexpectedToken()
|
||||
}
|
||||
if tok == RPAREN {
|
||||
break
|
||||
}
|
||||
|
||||
if !p.expectNext(IDENT) {
|
||||
return nil, p.unexpectedToken()
|
||||
}
|
||||
|
||||
_, _, columnName := p.rescan()
|
||||
primaryKeyNames = append(primaryKeyNames, columnName)
|
||||
}
|
||||
|
||||
for _, pkName := range primaryKeyNames {
|
||||
column := slices.IndexFunc(stmt.Columns, func(c Column) bool {
|
||||
return c.Name == pkName
|
||||
})
|
||||
stmt.Columns[column].Extra = append(stmt.Columns[column].Extra, "PRIMARY_KEY")
|
||||
}
|
||||
|
||||
case COMMA:
|
||||
continue
|
||||
|
||||
@@ -102,8 +134,8 @@ func (p *Parser) parseColumn() (Column, error) {
|
||||
_, _, lit := p.rescan()
|
||||
column := Column{Name: lit, Extra: make([]string, 0)}
|
||||
|
||||
if _, ok := p.expectOne(TEXT, INTEGER); !ok {
|
||||
return Column{}, p.unexpectedToken(TEXT, INTEGER)
|
||||
if _, ok := p.expectOne(TEXT, INTEGER, REAL, BLOB); !ok {
|
||||
return Column{}, p.unexpectedToken(TEXT, INTEGER, REAL, BLOB)
|
||||
}
|
||||
_, _, column.Type = p.rescan()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user