Working select statements for know tables, with and without semi at the end

This commit is contained in:
Pablu
2025-12-01 16:36:04 +01:00
parent 6182129022
commit 694bbb7934
3 changed files with 284 additions and 24 deletions

View File

@@ -61,6 +61,114 @@ func NewManager(path string) (*Manager, error) {
}, nil
}
func (m *Manager) RunSql(sqlText string) (Table, error) {
p := engine.NewParser(strings.NewReader(sqlText))
stmt, err := p.Parse()
if err != nil && !errors.Is(err, io.EOF) {
return Table{}, err
}
selectStmt, ok := stmt.(*engine.SelectStatement)
if !ok {
panic("HELP ITS NOT A SELECT STATMET")
}
table, ok := m.GetTable(selectStmt.From)
if !ok {
panic("HELP TABLE NOT FOUND")
}
rows, err := m.conn.Query(sqlText)
if err != nil {
return Table{}, err
}
table.Rows = make([]Row, 0)
if slices.Contains(selectStmt.Fields, "*") {
for rows.Next() {
cols := make([]any, len(table.Columns))
for i, column := range table.Columns {
switch column.Type {
case BLOB:
cols[i] = new([]byte)
case TEXT:
cols[i] = new(string)
case INTEGER:
cols[i] = new(int)
case REAL:
cols[i] = new(float64)
default:
panic("THIS SHOULD NEVER HAPPEN, WE HIT AN UNKNOWN COLUMN.TYPE")
}
}
err = rows.Scan(cols...)
if err != nil {
return Table{}, err
}
table.Rows = append(table.Rows, Row{
Values: anyToStr(cols),
})
}
return table, nil
} else {
columns := make([]Column, len(selectStmt.Fields))
firstTime := true
for rows.Next() {
cols := make([]any, len(selectStmt.Fields))
for i, s := range selectStmt.Fields {
for _, column := range table.Columns {
if column.Name != s {
continue
}
if firstTime {
columns[i] = column
}
switch column.Type {
case BLOB:
cols[i] = new([]byte)
case TEXT:
cols[i] = new(string)
case INTEGER:
cols[i] = new(int)
case REAL:
cols[i] = new(float64)
default:
panic("THIS SHOULD NEVER HAPPEN, WE HIT AN UNKNOWN COLUMN.TYPE")
}
}
}
firstTime = false
err = rows.Scan(cols...)
if err != nil {
return Table{}, err
}
table.Rows = append(table.Rows, Row{
Values: anyToStr(cols),
})
}
nTable := Table{
Name: selectStmt.From,
Columns: columns,
Rows: table.Rows,
}
return nTable, nil
}
}
func (m *Manager) Start() error {
for {
stmt, err := m.parser.Parse()