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

  1. Remove the DISTINCT keyword from the filter rule select
  2. If deduplication matters, handle it on the target/query side, not in the replication filter
  3. 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

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


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/903fa16022c06201. Report an issue: GitHub.