{"record":{"id":"28436d51d1774ff6","repo":"apache/iceberg","slug":"cannot-validate-s-against-a-view","errorCode":null,"errorMessage":"Cannot validate %s against a view","messagePattern":"Cannot validate (.+?) against a view","errorType":"exception","errorClass":"ValidationException","httpStatus":null,"severity":"error","filePath":"core/src/main/java/org/apache/iceberg/UpdateRequirement.java","lineNumber":34,"sourceCode":" * specific language governing permissions and limitations\n * under the License.\n */\npackage org.apache.iceberg;\n\nimport org.apache.iceberg.exceptions.CommitFailedException;\nimport org.apache.iceberg.exceptions.ValidationException;\nimport org.apache.iceberg.relocated.com.google.common.base.Preconditions;\nimport org.apache.iceberg.view.ViewMetadata;\n\n/** Represents a requirement for a {@link MetadataUpdate} */\npublic interface UpdateRequirement {\n  default void validate(TableMetadata base) {\n    throw new ValidationException(\n        \"Cannot validate %s against a table\", this.getClass().getSimpleName());\n  }\n\n  default void validate(ViewMetadata base) {\n    throw new ValidationException(\n        \"Cannot validate %s against a view\", this.getClass().getSimpleName());\n  }\n\n  class AssertTableDoesNotExist implements UpdateRequirement {\n    public AssertTableDoesNotExist() {}\n\n    @Override\n    public void validate(TableMetadata base) {\n      if (base != null) {\n        throw new CommitFailedException(\"Requirement failed: table already exists\");\n      }\n    }\n  }\n\n  class AssertTableUUID implements UpdateRequirement {\n    private final String uuid;\n\n    public AssertTableUUID(String uuid) {","sourceCodeStart":16,"sourceCodeEnd":52,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/UpdateRequirement.java#L16-L52","documentation":"The interface default validate(ViewMetadata) throws ValidationException when a requirement that only supports tables is validated against view metadata. Each concrete UpdateRequirement implements validate for the metadata type it applies to; passing the wrong type reaches this default and reports the requirement's class name.","triggerScenarios":"Calling UpdateRequirement.validate(ViewMetadata) on a table-scoped requirement such as AssertTableUUID or AssertRefSnapshotID.","commonSituations":"Shared commit client code applying table requirements during view commits, or vice versa, after refactoring to support views.","solutions":["Route table-scoped requirements to validate(TableMetadata) only.","Check the requirement class before choosing which metadata object to validate against.","Implement the missing validate(ViewMetadata) override if this is a new requirement type."],"exampleFix":"// before\nrequirement.validate(viewMetadata); // table-only requirement\n\n// after\nif (requirement instanceof UpdateRequirement.ViewRequirement) {\n  requirement.validate(viewMetadata);\n} else {\n  requirement.validate(tableMetadata);\n}","handlingStrategy":"type-guard","validationCode":"boolean isTableScoped = !(requirement instanceof UpdateRequirement.ViewRequirement);","typeGuard":"if (requirement instanceof UpdateRequirement.ViewRequirement) { requirement.validate(viewMetadata); } else { requirement.validate(tableMetadata); }","tryCatchPattern":"try { requirement.validate(viewMetadata); } catch (ValidationException e) { /* table-only requirement applied to a view; re-dispatch */ }","preventionTips":["Never apply table requirements during view commits.","Separate requirement lists per metadata kind before validation.","Check requirement class hierarchy before dispatching."],"tags":["validation-exception","commit-requirement","type-mismatch"],"backgroundTag":"type-mismatch","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}