bytebase/bytebase · error

failed to get statement in sheet %v

Error message

failed to get statement in sheet %v

What it means

After unfolding targets, buildCELVariablesForDatabaseChange fetches the SQL statement text via stores.GetSheetFull(ctx, target.sheetSha256). If that store call returns an error (DB failure, sheet row unreadable), it wraps with 'failed to get statement in sheet <sha>'. This is a storage-layer failure retrieving the sheet that holds the task's statement.

Source

Thrown at backend/component/review/evaluator.go:718

	}

	statementSummaryResults := map[statementSummaryKey]*storepb.PlanCheckRunResult_Result{}
	if planCheckRun != nil {
		statementSummaryResults = buildStatementSummaryResultMap(planCheckRun.Result.GetResults())
	}

	// A database group expands one sheet across every target, so classify each
	// (engine, sheet) once. Sheets run to common.MaxSheetCheckSize and this
	// path is synchronous on issue submission.
	statementTypeCache := map[statementTypeKey][]storepb.StatementType{}

	var celVarsList []map[string]any
	for _, target := range targets {
		taskStatement := ""
		if target.sheetSha256 != "" {
			sheet, err := stores.GetSheetFull(ctx, target.sheetSha256)
			if err != nil {
				return nil, approvalInputVersion, true, errors.Wrapf(err, "failed to get statement in sheet %v", target.sheetSha256)
			}
			if sheet == nil {
				return nil, approvalInputVersion, true, errors.Errorf("sheet %v not found", target.sheetSha256)
			}
			taskStatement = sheet.Statement
		}

		environmentID := ""
		if target.database.EffectiveEnvironmentID != nil {
			environmentID = *target.database.EffectiveEnvironmentID
		}

		// Base CEL variables
		celVars := map[string]any{
			common.CELAttributeResourceEnvironmentID: environmentID,
			common.CELAttributeResourceProjectID:     issue.ProjectID,
			common.CELAttributeResourceInstanceID:    target.database.InstanceID,
			common.CELAttributeResourceDatabaseName:  target.database.DatabaseName,

View on GitHub (pinned to 1870550677)

Solutions

  1. Check the metadata database health (PG_URL reachable) and inspect the wrapped store error for the root cause.
  2. Query the sheet table for the SHA printed in the message; if the row is missing, the plan's sheet reference is stale.
  3. Re-create or re-upload the statement so a sheet with the referenced SHA exists, then retry.
  4. If transient (timeout/deadlock), retry the plan check.
Defensive patterns

Strategy: retry

Validate before calling

// Pre-check sheet presence before evaluation:
sheet, err := stores.GetSheetFull(ctx, sha)
if err != nil || sheet == nil {
  return fmt.Errorf("sheet %s unavailable: %v", sha, err)
}

Try / catch

if err != nil {
  if isTransient(err) { // timeout/deadlock/connection
    return retryWithBackoff(op)
  }
  return fmt.Errorf("failed to get statement in sheet %s: %w", sha, err)
}

Prevention

When it happens

Trigger: target.sheetSha256 is non-empty and stores.GetSheetFull returns a non-nil error: metadata database connection failure, corrupted sheet row, or transient query failure while loading the sheet by SHA-256.

Common situations: Metadata Postgres down or connection pool exhausted during plan check; sheet row deleted concurrently by cleanup while an old plan/issue still references its SHA; binary/schema drift in the sheet table after a version upgrade.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


AI-assisted analysis of bytebase/bytebase@1870550677 (2026-09-06). Data as JSON: /api/errors/5da4036561941fc0. Report an issue: GitHub.