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

  1. Check for AlreadyExists via status.FromError and either pick a new ID or update the existing view
  2. Validate the SQL query (tables/column families exist) before creation
  3. Grant roles/bigtable.admin to the service account
  4. 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

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


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/070cd2ed2f6b4896. Report an issue: GitHub.