show tables works

This commit is contained in:
chrislu
2025-09-01 01:25:54 -07:00
parent aa883472a5
commit 3e54e7356c
3 changed files with 53 additions and 27 deletions

View File

@@ -92,6 +92,11 @@ func runSql(command *Command, args []string) bool {
interactive: interactive, interactive: interactive,
} }
// Set current database in SQL engine if specified via command line
if *sqlDatabase != "" {
ctx.engine.GetCatalog().SetCurrentDatabase(*sqlDatabase)
}
// Execute based on mode // Execute based on mode
switch { switch {
case *sqlQuery != "": case *sqlQuery != "":
@@ -215,12 +220,19 @@ func runInteractiveShell(ctx *SQLContext) bool {
} }
// Handle database switching // Handle database switching
if strings.HasPrefix(strings.ToUpper(line), "USE ") { upperLine := strings.ToUpper(line)
dbName := strings.TrimSpace(strings.TrimPrefix(strings.ToUpper(line), "USE ")) if strings.HasPrefix(upperLine, "USE ") {
dbName = strings.TrimSuffix(dbName, ";") // Extract database name preserving original case
ctx.currentDatabase = dbName parts := strings.SplitN(line, " ", 2)
fmt.Printf("Database changed to: %s\n\n", dbName) if len(parts) >= 2 {
continue dbName := strings.TrimSpace(parts[1])
dbName = strings.TrimSuffix(dbName, ";")
ctx.currentDatabase = dbName
// Also update the SQL engine's catalog current database
ctx.engine.GetCatalog().SetCurrentDatabase(dbName)
fmt.Printf("Database changed to: %s\n\n", strings.ToUpper(dbName))
continue
}
} }
// Handle output format switching // Handle output format switching

View File

@@ -4,7 +4,7 @@ import (
"context" "context"
"fmt" "fmt"
"strings" "strings"
"github.com/seaweedfs/seaweedfs/weed/query/sqltypes" "github.com/seaweedfs/seaweedfs/weed/query/sqltypes"
"github.com/xwb1989/sqlparser" "github.com/xwb1989/sqlparser"
) )
@@ -18,32 +18,32 @@ func (e *SQLEngine) executeDescribeStatement(ctx context.Context, tableName stri
database = "default" database = "default"
} }
} }
// Get topic schema from broker // Get topic schema from broker
recordType, err := e.catalog.brokerClient.GetTopicSchema(ctx, database, tableName) recordType, err := e.catalog.brokerClient.GetTopicSchema(ctx, database, tableName)
if err != nil { if err != nil {
return &QueryResult{Error: err}, err return &QueryResult{Error: err}, err
} }
// Format schema as DESCRIBE output // Format schema as DESCRIBE output
result := &QueryResult{ result := &QueryResult{
Columns: []string{"Field", "Type", "Null", "Key", "Default", "Extra"}, Columns: []string{"Field", "Type", "Null", "Key", "Default", "Extra"},
Rows: make([][]sqltypes.Value, len(recordType.Fields)), Rows: make([][]sqltypes.Value, len(recordType.Fields)),
} }
for i, field := range recordType.Fields { for i, field := range recordType.Fields {
sqlType := e.convertMQTypeToSQL(field.Type) sqlType := e.convertMQTypeToSQL(field.Type)
result.Rows[i] = []sqltypes.Value{ result.Rows[i] = []sqltypes.Value{
sqltypes.NewVarChar(field.Name), // Field sqltypes.NewVarChar(field.Name), // Field
sqltypes.NewVarChar(sqlType), // Type sqltypes.NewVarChar(sqlType), // Type
sqltypes.NewVarChar("YES"), // Null (assume nullable) sqltypes.NewVarChar("YES"), // Null (assume nullable)
sqltypes.NewVarChar(""), // Key (no keys for now) sqltypes.NewVarChar(""), // Key (no keys for now)
sqltypes.NewVarChar("NULL"), // Default sqltypes.NewVarChar("NULL"), // Default
sqltypes.NewVarChar(""), // Extra sqltypes.NewVarChar(""), // Extra
} }
} }
return result, nil return result, nil
} }
@@ -53,8 +53,16 @@ func (e *SQLEngine) executeShowStatementWithDescribe(ctx context.Context, stmt *
case "DATABASES": case "DATABASES":
return e.showDatabases(ctx) return e.showDatabases(ctx)
case "TABLES": case "TABLES":
// TODO: Parse FROM clause properly for database specification // Parse FROM clause for database specification, or use current database context
return e.showTables(ctx, "") database := ""
if stmt.OnTable.Name.String() != "" {
// SHOW TABLES FROM database_name
database = stmt.OnTable.Name.String()
} else {
// Use current database context
database = e.catalog.GetCurrentDatabase()
}
return e.showTables(ctx, database)
case "COLUMNS": case "COLUMNS":
// SHOW COLUMNS FROM table is equivalent to DESCRIBE // SHOW COLUMNS FROM table is equivalent to DESCRIBE
if stmt.OnTable.Name.String() != "" { if stmt.OnTable.Name.String() != "" {
@@ -82,16 +90,16 @@ func (e *SQLEngine) handleDescribeCommand(ctx context.Context, sql string) (*Que
err := fmt.Errorf("DESCRIBE requires a table name") err := fmt.Errorf("DESCRIBE requires a table name")
return &QueryResult{Error: err}, err return &QueryResult{Error: err}, err
} }
tableName := parts[1] tableName := parts[1]
database := "" database := ""
// Handle database.table format // Handle database.table format
if strings.Contains(tableName, ".") { if strings.Contains(tableName, ".") {
parts := strings.SplitN(tableName, ".", 2) parts := strings.SplitN(tableName, ".", 2)
database = parts[0] database = parts[0]
tableName = parts[1] tableName = parts[1]
} }
return e.executeDescribeStatement(ctx, tableName, database) return e.executeDescribeStatement(ctx, tableName, database)
} }

View File

@@ -41,6 +41,11 @@ func NewSQLEngine(masterAddress string) *SQLEngine {
} }
} }
// GetCatalog returns the schema catalog for external access
func (e *SQLEngine) GetCatalog() *SchemaCatalog {
return e.catalog
}
// ExecuteSQL parses and executes a SQL statement // ExecuteSQL parses and executes a SQL statement
// Assumptions: // Assumptions:
// 1. All SQL statements are MySQL-compatible via xwb1989/sqlparser // 1. All SQL statements are MySQL-compatible via xwb1989/sqlparser
@@ -823,11 +828,12 @@ func (e *SQLEngine) showDatabases(ctx context.Context) (*QueryResult, error) {
} }
func (e *SQLEngine) showTables(ctx context.Context, dbName string) (*QueryResult, error) { func (e *SQLEngine) showTables(ctx context.Context, dbName string) (*QueryResult, error) {
// Assumption: If no database specified, use default or return error // Use current database context if no database specified
if dbName == "" { if dbName == "" {
// TODO: Implement default database context dbName = e.catalog.GetCurrentDatabase()
// For now, use 'default' as the default database if dbName == "" {
dbName = "default" dbName = "default"
}
} }
tables, err := e.catalog.ListTables(dbName) tables, err := e.catalog.ListTables(dbName)