bytebase/bytebase · error
failed to get SQL mode
Error message
failed to get SQL mode
What it means
GetDatabaseMetadata for TiDB configures the parser's SQL mode by calling mysql.GetSQLMode(mysql.DefaultSQLMode). If that call fails (it essentially never does with the built-in default mode string), the error is wrapped with this message. It is a defensive wrap during parser initialization, before any user SQL is parsed.
Source
Thrown at backend/plugin/schema/tidb/get_database_metadata.go:33
// Register pingcap parser driver.
_ "github.com/pingcap/tidb/pkg/types/parser_driver"
storepb "github.com/bytebase/bytebase/backend/generated-go/store"
"github.com/bytebase/bytebase/backend/plugin/schema"
)
func init() {
schema.RegisterGetDatabaseMetadata(storepb.Engine_TIDB, GetDatabaseMetadata)
}
// GetDatabaseMetadata parses the database schema text and returns the metadata using TiDB's parser.
func GetDatabaseMetadata(schemaText string) (*storepb.DatabaseSchemaMetadata, error) {
// Use TiDB's parser to parse the SQL
p := parser.New()
p.EnableWindowFunc(true)
mode, err := mysql.GetSQLMode(mysql.DefaultSQLMode)
if err != nil {
return nil, errors.Wrap(err, "failed to get SQL mode")
}
mode = mysql.DelSQLMode(mode, mysql.ModeNoZeroDate)
mode = mysql.DelSQLMode(mode, mysql.ModeNoZeroInDate)
p.SetSQLMode(mode)
stmts, _, err := p.Parse(schemaText, "", "")
if err != nil {
return nil, errors.Wrap(err, "failed to parse schema")
}
extractor := &metadataExtractor{
schemas: make(map[string]*storepb.SchemaMetadata),
tables: make(map[tableKey]*storepb.TableMetadata),
views: make(map[viewKey]*storepb.ViewMetadata),
result: &storepb.DatabaseSchemaMetadata{
Name: "",
},
}View on GitHub (pinned to 1870550677)
Solutions
- Check the wrapped inner error for which SQL mode token failed to parse
- Verify the pingcap/tidb/parser dependency version and try upgrading/downgrading it
- Pin a known-good parser version in go.mod
- If reproducible, replace DefaultSQLMode with an explicit mode string known to parse
Example fix
// before
mode, err := mysql.GetSQLMode(mysql.DefaultSQLMode)
if err != nil {
return nil, errors.Wrap(err, "failed to get SQL mode")
}
// after
mode, err := mysql.GetSQLMode(mysql.DefaultSQLMode)
if err != nil {
mode, err = mysql.GetSQLMode("STRICT_TRANS_TABLES") // fallback mode
if err != nil {
return nil, errors.Wrap(err, "failed to get SQL mode")
}
} Defensive patterns
Strategy: try-catch
Try / catch
meta, err := tidb.GetDatabaseMetadata(schemaText)
if err != nil && strings.Contains(err.Error(), "failed to get SQL mode") {
return fmt.Errorf("parser initialization failed (likely parser dependency issue): %w", err)
} Prevention
- Pin the pingcap/tidb/parser version and test parser init in CI on dependency upgrades
- Treat this error as an environment/dependency problem, not user-input problem
- Keep DefaultSQLMode untouched; pass custom modes through explicit, tested strings
When it happens
Trigger: Calling schema.tidb.GetDatabaseMetadata(schemaText) when mysql.GetSQLMode fails on mysql.DefaultSQLMode — practically only if the DefaultSQLMode constant is malformed or a custom/pinned parser version has a broken mode parser.
Common situations: Dependency upgrades of pingcap/tidb/parser changing SQL-mode parsing behavior; forked parser builds with a modified DefaultSQLMode; this is nearly always an upstream library issue, not user input.
Related errors
AI-assisted analysis of bytebase/bytebase@1870550677 (2026-09-06).
Data as JSON: /api/errors/94ac5fdddd342f2b.
Report an issue: GitHub.