bytebase/bytebase · error
schema name %s is specified without table name
Error message
schema name %s is specified without table name
What it means
Thrown by tsqlIsFieldSensitive when a schema name is supplied without a table name in the qualifier tuple. TSQL object names must fill hierarchy levels contiguously from the leaf (column, table, schema, database); skipping the table level while giving a schema is rejected via the mask check `mask&maskTableName == 0`.
Source
Thrown at backend/plugin/parser/tsql/query_span_extractor.go:298
maskNone maskType = 0
maskDatabaseName maskType = 1 << iota
maskSchemaName
maskTableName
maskColumnName
)
mask := maskNone
if normalizedColumnName != "" {
mask |= maskColumnName
}
if normalizedTableName != "" {
if mask&maskColumnName == 0 {
return base.QuerySpanResult{}, errors.Errorf(`table name %s is specified without column name`, normalizedTableName)
}
mask |= maskTableName
}
if normalizedSchemaName != "" {
if mask&maskTableName == 0 {
return base.QuerySpanResult{}, errors.Errorf(`schema name %s is specified without table name`, normalizedSchemaName)
}
mask |= maskSchemaName
}
if normalizedDatabaseName != "" {
if mask&maskSchemaName == 0 {
return base.QuerySpanResult{}, errors.Errorf(`database name %s is specified without schema name`, normalizedDatabaseName)
}
mask |= maskDatabaseName
}
if mask == maskNone {
return base.QuerySpanResult{}, errors.Errorf(`no object name is specified`)
}
// We just need to iterate through the fromFieldList sequentially until we find the first matching object.
//
// It is safe if there are two or more objects in the fromFieldList have the same column name, because the executor
// will throw a compilation error if the column name is ambiguous.View on GitHub (pinned to 1870550677)
Solutions
- Supply the table name: use `database.schema.table.column` or at minimum `schema.table.column`.
- Check the caller's argument order — table and schema are commonly swapped when building the tuple programmatically.
- If the reference legitimately has no table (e.g. a schema-level check), do not route it through the column resolver.
Example fix
// before: table slot empty resolveField(db="appdb", schema="dbo", table="", column="amount") // after resolveField(db="appdb", schema="dbo", table="orders", column="amount")
Defensive patterns
Strategy: validation
Validate before calling
if schema != "" && table == "" {
return errors.New("schema given without table in field resolution")
} Type guard
func contiguous(db, schema, table, column string) bool {
return !(schema != "" && table == "")
} Try / catch
res, err := q.tsqslIsFieldSensitive(db, schema, table, column)
if err != nil && strings.Contains(err.Error(), "without table name") {
return base.QuerySpanResult{}, fmt.Errorf("malformed qualifier: %w", err)
} Prevention
- Fill the table slot before the schema slot when building name tuples.
- Watch for swapped table/schema arguments in programmatic callers.
- Normalize `schema..col` style references before resolution.
When it happens
Trigger: Calling tsqlIsFieldSensitive with normalizedSchemaName != "" but normalizedTableName == "" — e.g. a two-part reference whose inner part was misparsed so the table slot is empty.
Common situations: Parsing malformed or generated references like `schema..column` or `db.schema.` where the table component was lost, or callers assembling name parts into the wrong positional arguments.
Understand the failure class
Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.
Related errors
- table name %s is specified without column name
- database name %s is specified without schema name
- linked server is not supported yet, but found %q
- failed to extract view body
- no matching table %q.%q.%q
AI-assisted analysis of bytebase/bytebase@1870550677 (2026-09-06).
Data as JSON: /api/errors/f47db1c4920723fd.
Report an issue: GitHub.