vitessio/vitess · error
unsupported select from dual
Error message
unsupported select from dual
What it means
analyzeSelectFrom requires the select's FROM clause to reference an actual table. A select with no FROM (i.e. 'select 1 from dual' / 'select expr') has no source table for a replication plan and is rejected with this error.
Source
Thrown at go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go:402
CollationEnv: tpb.collationEnv,
WorkflowConfig: tpb.workflowConfig,
}
}
func analyzeSelectFrom(query string, parser *sqlparser.Parser) (sel *sqlparser.Select, from string, err error) {
statement, err := parser.Parse(query)
if err != nil {
return nil, "", err
}
sel, ok := statement.(*sqlparser.Select)
if !ok {
return nil, "", errors.New("unsupported non-select statement")
}
if sel.Distinct {
return nil, "", errors.New("unsupported distinct clause")
}
if len(sel.From) == 0 {
return nil, "", errors.New("unsupported select from dual")
}
if len(sel.From) > 1 {
return nil, "", errors.New("unsupported multi-table usage")
}
node, ok := sel.From[0].(*sqlparser.AliasedTableExpr)
if !ok {
return nil, "", fmt.Errorf("unsupported from expression (%T)", sel.From[0])
}
fromTable := sqlparser.GetTableName(node.Expr)
if fromTable.IsEmpty() {
return nil, "", fmt.Errorf("unsupported from source (%T)", node.Expr)
}
return sel, fromTable.String(), nil
}
func (tpb *tablePlanBuilder) analyzeExprs(selExprs []sqlparser.SelectExpr) error {
for _, selExpr := range selExprs {
cexpr, err := tpb.analyzeExpr(selExpr)View on GitHub (pinned to 01a25a7d17)
Solutions
- Include a real table in the filter rule: 'select * from <table> where ...'
- Fix rule generation so the table name is always interpolated into the filter query
- Validate filter rules before submitting them to MoveTables/Reshard
Example fix
// before "filter": "select 1" // after "filter": "select * from t where ..."
Defensive patterns
Strategy: validation
Validate before calling
sel := stmt.(*sqlparser.Select)
if len(sel.From) == 0 || sel.From[0].SQLNode() == nil {
return errors.New("filter rule must select from a table")
} Prevention
- Always include a real table name in filter queries
- Verify generated rules interpolate the table name
- Reject FROM-less selects in filter-rule validation tooling
When it happens
Trigger: A filter rule whose query is 'select 1', 'select now()' or any FROM-less select (sqlparser yields an empty sel.From).
Common situations: Placeholder/test queries pasted into filter rules; generated rules where the table name was accidentally dropped.
Related errors
- unsupported mix of '*' and columns
- unsupported qualifier for '*' expression
- unsupported non-select statement
- unsupported distinct clause
- unexpected event on table %s
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/ccccebf3080cda2b.
Report an issue: GitHub.