googleapis/mcp-toolbox · error
failed to create materialized view: %w
Error message
failed to create materialized view: %w
What it means
CreateMaterializedView wraps errors from InstanceAdmin.CreateMaterializedView. A materialized view is a query-backed view persisted server-side; creation fails when the ID already exists, the query is invalid, permissions are missing, or the instance is wrong. The SDK error is wrapped with %w.
Source
Thrown at internal/sources/bigtable/admin_wrappers.go:252
return map[string]string{"status": "logical view deleted successfully"}, nil
}
func (s *Source) GetMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {
view, err := s.InstanceAdmin.MaterializedViewInfo(ctx, instanceId, materializedViewId)
if err != nil {
return nil, fmt.Errorf("failed to get materialized view: %w", err)
}
return view, nil
}
func (s *Source) CreateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {
conf := &bigtable.MaterializedViewInfo{
MaterializedViewID: materializedViewId,
Query: query,
}
err := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)
if err != nil {
return nil, fmt.Errorf("failed to create materialized view: %w", err)
}
return map[string]string{"status": "materialized view created successfully"}, nil
}
func (s *Source) UpdateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {
conf := bigtable.MaterializedViewInfo{ // MUST be value per bigtable SDK
MaterializedViewID: materializedViewId,
Query: query,
}
err := s.InstanceAdmin.UpdateMaterializedView(ctx, instanceId, conf)
if err != nil {
return nil, fmt.Errorf("failed to update materialized view: %w", err)
}
return map[string]string{"status": "materialized view updated successfully"}, nil
}
func (s *Source) DeleteMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {
err := s.InstanceAdmin.DeleteMaterializedView(ctx, instanceId, materializedViewId)View on GitHub (pinned to 8cc6e09de2)
Solutions
- Check for AlreadyExists via status.FromError and either pick a new ID or update the existing view
- Validate the SQL query (tables/column families exist) before creation
- Grant roles/bigtable.admin to the service account
- Confirm the instance exists and matches the configured project
Example fix
// before: plain create fails on rerun
err := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)
// after: create-or-update
err := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)
if err != nil && status.Code(err) == codes.AlreadyExists {
return s.UpdateMaterializedView(ctx, instanceId, id, query)
} Defensive patterns
Strategy: validation
Validate before calling
func validateMaterializedViewInput(instanceId, viewId, query string) error {
if instanceId == "" || viewId == "" || query == "" {
return errors.New("instanceId, materializedViewId and query are required")
}
if !regexp.MustCompile(`^[a-zA-Z0-9._-]{1,255}$`).MatchString(viewId) {
return fmt.Errorf("invalid materialized view id %q", viewId)
}
return nil
} Type guard
func isAlreadyExists(err error) bool {
st, ok := status.FromError(errors.Unwrap(err))
return ok && st.Code() == codes.AlreadyExists
} Try / catch
res, err := src.CreateMaterializedView(ctx, instanceId, viewId, query)
if err != nil {
if isAlreadyExists(err) {
return src.UpdateMaterializedView(ctx, instanceId, viewId, query)
}
return err
} Prevention
- Implement create-or-update so reruns don't fail on AlreadyExists
- Validate the SQL query references existing tables/column families
- Ensure the service account has roles/bigtable.admin
- Check project quotas if creation fails repeatedly
When it happens
Trigger: Calling CreateMaterializedView (bigtable_create_materialized_view tool) when: materializedViewId already exists (AlreadyExists), the SQL query fails server-side validation, caller lacks bigtable materialized view create permission, or instanceId does not exist.
Common situations: Re-running create scripts against existing views; queries referencing non-existent tables/column families; IAM role removed; typo'd instance; quota issues on the project.
Related errors
- failed to list materialized views: %w
- failed to create logical view: %w
- failed to update logical view: %w
- failed to delete logical view: %w
- failed to get materialized view: %w
AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05).
Data as JSON: /api/errors/070cd2ed2f6b4896.
Report an issue: GitHub.