Add working tview, add working load ond Tables, remove giu

This commit is contained in:
Pablu
2025-12-01 15:00:58 +01:00
parent 027aad1374
commit 6182129022
11 changed files with 383 additions and 172 deletions

View File

@@ -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

View File

@@ -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()