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

  1. Check the wrapped inner error for which SQL mode token failed to parse
  2. Verify the pingcap/tidb/parser dependency version and try upgrading/downgrading it
  3. Pin a known-good parser version in go.mod
  4. 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

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.