{"record":{"id":"13c99dad34279b8c","repo":"apache/iceberg","slug":"s-doesn-t-implement-fromsnapshotinclusive","errorCode":null,"errorMessage":"%s doesn't implement fromSnapshotInclusive","messagePattern":"(.+?) doesn't implement fromSnapshotInclusive","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"api/src/main/java/org/apache/iceberg/IncrementalScan.java","lineNumber":47,"sourceCode":"   *\n   * @param fromSnapshotId the start snapshot ID (inclusive)\n   * @return this for method chaining\n   * @throws IllegalArgumentException if the start snapshot is not an ancestor of the end snapshot\n   */\n  ThisT fromSnapshotInclusive(long fromSnapshotId);\n\n  /**\n   * Instructs this scan to look for changes starting from a particular snapshot (inclusive).\n   *\n   * <p>If the start snapshot is not configured, it defaults to the oldest ancestor of the end\n   * snapshot (inclusive).\n   *\n   * @param ref the start ref name that points to a particular snapshot ID (inclusive)\n   * @return this for method chaining\n   * @throws IllegalArgumentException if the start snapshot is not an ancestor of the end snapshot\n   */\n  default ThisT fromSnapshotInclusive(String ref) {\n    throw new UnsupportedOperationException(\n        this.getClass().getName() + \" doesn't implement fromSnapshotInclusive\");\n  }\n\n  /**\n   * Instructs this scan to look for changes starting from a particular snapshot (exclusive).\n   *\n   * <p>If the start snapshot is not configured, it defaults to the oldest ancestor of the end\n   * snapshot (inclusive).\n   *\n   * @param fromSnapshotId the start snapshot ID (exclusive)\n   * @return this for method chaining\n   * @throws IllegalArgumentException if the start snapshot is not an ancestor of the end snapshot\n   */\n  ThisT fromSnapshotExclusive(long fromSnapshotId);\n\n  /**\n   * Instructs this scan to look for changes starting from a particular snapshot (exclusive).\n   *","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/api/src/main/java/org/apache/iceberg/IncrementalScan.java#L29-L65","documentation":"Default-interface guard on IncrementalScan: thrown only when the concrete scan implementation did not override fromSnapshotInclusive, so refining the scan by an inclusive start snapshot is unsupported for that class. The %s names the offending runtime class; it signals a missing capability in the implementation, not bad input.","triggerScenarios":"Thrown at api/src/main/java/org/apache/iceberg/IncrementalScan.java:47 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Use a scan implementation that supports incremental scans (e.g. the core DataTableScan-based incremental scans)","Catch UnsupportedOperationException and fall back to a non-incremental scan","Extend the custom scan class and override fromSnapshotInclusive"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}