{"record":{"id":"070cd2ed2f6b4896","repo":"googleapis/mcp-toolbox","slug":"failed-to-create-materialized-view-w","errorCode":null,"errorMessage":"failed to create materialized view: %w","messagePattern":"failed to create materialized view: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/bigtable/admin_wrappers.go","lineNumber":252,"sourceCode":"\treturn map[string]string{\"status\": \"logical view deleted successfully\"}, nil\n}\n\nfunc (s *Source) GetMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {\n\tview, err := s.InstanceAdmin.MaterializedViewInfo(ctx, instanceId, materializedViewId)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get materialized view: %w\", err)\n\t}\n\treturn view, nil\n}\n\nfunc (s *Source) CreateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {\n\tconf := &bigtable.MaterializedViewInfo{\n\t\tMaterializedViewID: materializedViewId,\n\t\tQuery:              query,\n\t}\n\terr := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create materialized view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"materialized view created successfully\"}, nil\n}\n\nfunc (s *Source) UpdateMaterializedView(ctx context.Context, instanceId, materializedViewId, query string) (any, error) {\n\tconf := bigtable.MaterializedViewInfo{ // MUST be value per bigtable SDK\n\t\tMaterializedViewID: materializedViewId,\n\t\tQuery:              query,\n\t}\n\terr := s.InstanceAdmin.UpdateMaterializedView(ctx, instanceId, conf)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to update materialized view: %w\", err)\n\t}\n\treturn map[string]string{\"status\": \"materialized view updated successfully\"}, nil\n}\n\nfunc (s *Source) DeleteMaterializedView(ctx context.Context, instanceId, materializedViewId string) (any, error) {\n\terr := s.InstanceAdmin.DeleteMaterializedView(ctx, instanceId, materializedViewId)","sourceCodeStart":234,"sourceCodeEnd":270,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/bigtable/admin_wrappers.go#L234-L270","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before: plain create fails on rerun\nerr := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)\n// after: create-or-update\nerr := s.InstanceAdmin.CreateMaterializedView(ctx, instanceId, conf)\nif err != nil && status.Code(err) == codes.AlreadyExists {\n    return s.UpdateMaterializedView(ctx, instanceId, id, query)\n}","handlingStrategy":"validation","validationCode":"func validateMaterializedViewInput(instanceId, viewId, query string) error {\n    if instanceId == \"\" || viewId == \"\" || query == \"\" {\n        return errors.New(\"instanceId, materializedViewId and query are required\")\n    }\n    if !regexp.MustCompile(`^[a-zA-Z0-9._-]{1,255}$`).MatchString(viewId) {\n        return fmt.Errorf(\"invalid materialized view id %q\", viewId)\n    }\n    return nil\n}","typeGuard":"func isAlreadyExists(err error) bool {\n    st, ok := status.FromError(errors.Unwrap(err))\n    return ok && st.Code() == codes.AlreadyExists\n}","tryCatchPattern":"res, err := src.CreateMaterializedView(ctx, instanceId, viewId, query)\nif err != nil {\n    if isAlreadyExists(err) {\n        return src.UpdateMaterializedView(ctx, instanceId, viewId, query)\n    }\n    return err\n}","preventionTips":["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"],"tags":["gcp","bigtable","admin-api","permissions"],"backgroundTag":"gcp-api-error","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}