vitessio/vitess · error
unsupported distinct clause
Error message
unsupported distinct clause
What it means
Filter rules for vreplication must be plain selects without a DISTINCT clause; distinct semantics cannot be preserved in a row-streaming replication plan, so buildTablePlan (via analyzeSelectFrom) rejects sel.Distinct.
Source
Thrown at go/vt/vttablet/tabletmanager/vreplication/table_plan_builder.go:399
TablePlanBuilder: tpb,
PartialInserts: make(map[string]*sqlparser.ParsedQuery, 0),
PartialUpdates: make(map[string]*sqlparser.ParsedQuery, 0),
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
}
View on GitHub (pinned to 01a25a7d17)
Solutions
- Remove the DISTINCT keyword from the filter rule select
- If deduplication matters, handle it on the target/query side, not in the replication filter
- Use 'select * from t where ...' for row filtering instead
Example fix
// before "filter": "select distinct sku from t" // after "filter": "select * from t"
Defensive patterns
Strategy: validation
Validate before calling
sel := stmt.(*sqlparser.Select)
if sel.Distinct {
return errors.New("DISTINCT not allowed in vreplication filter rules")
} Prevention
- Strip DISTINCT from filter-rule templates
- Move deduplication logic to query/application side
- Add filter-rule SQL checks to CI
When it happens
Trigger: A filter rule like 'select distinct col from t' or 'select distinct * from t' used in MoveTables/Reshard/filter configuration.
Common situations: Users trying to deduplicate rows via the filter rule; SQL copied from reporting queries used as a vreplication filter.
Related errors
- unsupported mix of '*' and columns
- unsupported qualifier for '*' expression
- unsupported non-select statement
- unsupported select from dual
- unexpected event on table %s
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/903fa16022c06201.
Report an issue: GitHub.