{"record":{"id":"3e8c08edb8794979","repo":"vitessio/vitess","slug":"tenant-column-name-not-defined-in-multi-tenant-spe","errorCode":null,"errorMessage":"tenant column name not defined in multi-tenant spec","messagePattern":"tenant column name not defined in multi-tenant spec","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/vtctl/workflow/utils.go","lineNumber":850,"sourceCode":"\t\t\tType: sqlparser.WhereClause,\n\t\t\tExpr: filter,\n\t\t}\n\t}\n}\n\nfunc getTenantClause(vrOptions *vtctldatapb.WorkflowOptions,\n\ttargetVSchema *vindexes.KeyspaceSchema, parser *sqlparser.Parser,\n) (*sqlparser.Expr, error) {\n\tif vrOptions.TenantId == \"\" {\n\t\treturn nil, nil\n\t}\n\tif targetVSchema == nil || targetVSchema.MultiTenantSpec == nil {\n\t\treturn nil, errors.New(\"target keyspace not defined, or it does not have multi-tenant spec\")\n\t}\n\ttenantColumnName := targetVSchema.MultiTenantSpec.TenantIdColumnName\n\ttenantColumnType := targetVSchema.MultiTenantSpec.TenantIdColumnType\n\tif tenantColumnName == \"\" {\n\t\treturn nil, errors.New(\"tenant column name not defined in multi-tenant spec\")\n\t}\n\n\tvar tenantId string\n\tswitch tenantColumnType {\n\tcase querypb.Type_INT64:\n\t\t_, err := strconv.Atoi(vrOptions.TenantId)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"tenant id is not a valid int: %s\", vrOptions.TenantId)\n\t\t}\n\t\ttenantId = vrOptions.TenantId\n\tcase querypb.Type_VARCHAR:\n\t\ttenantId = sqltypes.EncodeStringSQL(vrOptions.TenantId)\n\tdefault:\n\t\treturn nil, fmt.Errorf(\"unsupported tenant column type: %s\", tenantColumnType)\n\t}\n\n\tstmt, err := parser.Parse(fmt.Sprintf(\"select * from t where %s = %s\", sqlescape.EscapeID(tenantColumnName), tenantId))\n\tif err != nil {","sourceCodeStart":832,"sourceCodeEnd":868,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtctl/workflow/utils.go#L832-L868","documentation":"When a tenant clause is being built, the multi-tenant spec's tenant_id_column_name must be non-empty; an empty name means the filter expression cannot reference the tenant column. This error is raised after the MultiTenantSpec existence check (234) but before parsing the tenant id value.","triggerScenarios":"Running a VReplication workflow with --tenant-id where the target keyspace vschema has a multi_tenant_spec but omits tenant_id_column_name (or sets it to \"\").","commonSituations":"Partially written vschema — spec added but column name field left blank, or a copy/paste from a template where only the column type was set.","solutions":["Set tenant_id_column_name in the target keyspace's multi_tenant_spec and re-apply the vschema","Confirm the tenant column actually exists in the replicated tables","Remove --tenant-id if tenant filtering is not needed"],"exampleFix":"// before\n{\"multi_tenant_spec\":{\"tenant_id_column_type\":\"INT64\"}}\n// after\n{\"multi_tenant_spec\":{\"tenant_id_column_name\":\"tenant_id\",\"tenant_id_column_type\":\"INT64\"}}","handlingStrategy":"validation","validationCode":"spec := targetVSchema.MultiTenantSpec\nif spec == nil || spec.TenantIdColumnName == \"\" {\n    return errors.New(\"multi_tenant_spec.tenant_id_column_name must be set\")\n}","typeGuard":"func tenantColumnDefined(vs *vindexes.KeyspaceSchema) bool {\n    return vs != nil && vs.MultiTenantSpec != nil && vs.MultiTenantSpec.TenantIdColumnName != \"\"\n}","tryCatchPattern":"expr, err := getTenantClause(vrOptions, targetVSchema, parser)\nif err != nil && strings.Contains(err.Error(), \"tenant column name not defined\") {\n    return fmt.Errorf(\"fix multi_tenant_spec in vschema: %w\", err)\n}","preventionTips":["Always set both tenant_id_column_name and tenant_id_column_type together","Lint vschema files for empty required fields","Verify the tenant column exists in the source tables too"],"tags":["vreplication","vschema","multi-tenant"],"backgroundTag":"missing-multitenant-spec","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}