{"record":{"id":"064d84ca4f0f2506","repo":"apache/iceberg","slug":"source-table-s-contains-one-all-of-the-reserved-p-064d84","errorCode":null,"errorMessage":"Source table %s contains one/all of the reserved property keys: %s, %s.","messagePattern":"Source table (.+?) contains one/all of the reserved property keys: (.+?), (.+?)\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java","lineNumber":349,"sourceCode":"  }\n\n  @Override\n  public CatalogTable getTable(ObjectPath tablePath)\n      throws TableNotExistException, CatalogException {\n    Table table = loadIcebergTable(tablePath);\n\n    // Flink's CREATE TABLE LIKE clause relies on properties sent back here to create new table.\n    // As Flink API accepts only Map<String, String> for props, here we are serializing catalog\n    // name, database, table as json string to distinguish between catalog info\n    // and table properties in createTable.\n    String srcCatalogProps =\n        FlinkCreateTableOptions.toJson(\n            getName(), tablePath.getDatabaseName(), tablePath.getObjectName());\n\n    Map<String, String> tableProps = table.properties();\n    if (tableProps.containsKey(FlinkCreateTableOptions.CONNECTOR_PROPS_KEY)\n        || tableProps.containsKey(FlinkCreateTableOptions.SRC_CATALOG_PROPS_KEY)) {\n      throw new IllegalArgumentException(\n          String.format(\n              \"Source table %s contains one/all of the reserved property keys: %s, %s.\",\n              tablePath,\n              FlinkCreateTableOptions.CONNECTOR_PROPS_KEY,\n              FlinkCreateTableOptions.SRC_CATALOG_PROPS_KEY));\n    }\n\n    ImmutableMap.Builder<String, String> mergedProps = ImmutableMap.builder();\n    mergedProps.put(\n        FlinkCreateTableOptions.CONNECTOR_PROPS_KEY, FlinkDynamicTableFactory.FACTORY_IDENTIFIER);\n    mergedProps.put(FlinkCreateTableOptions.SRC_CATALOG_PROPS_KEY, srcCatalogProps);\n    mergedProps.putAll(tableProps);\n\n    return toCatalogTableWithProps(table, mergedProps.build());\n  }\n\n  private Table loadIcebergTable(ObjectPath tablePath) throws TableNotExistException {\n    try {","sourceCodeStart":331,"sourceCodeEnd":367,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/flink/v2.1/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java#L331-L367","documentation":"FlinkCatalog.getTable rejects Iceberg tables whose properties contain the reserved keys connector-type/src-catalog properties defined by FlinkCreateTableOptions. These keys are bookkeeping added by Flink for bridging non-iceberg catalogs; a source table in an iceberg catalog must never carry them, so the library fails with IllegalArgumentException.","triggerScenarios":"Reading (getTable) a table whose metadata contains FlinkCreateTableOptions.CONNECTOR_PROPS_KEY or SRC_CATALOG_PROPS_KEY — usually because the table was created with connector='iceberg' options copied into its Iceberg properties.","commonSituations":"Tables created in a non-iceberg catalog and then registered/copied into an iceberg catalog with their Flink options intact; manual table metadata edits that leaked connector options into Iceberg table properties.","solutions":["Recreate the table without the connector/src-catalog options so they are not persisted in Iceberg properties","Remove the reserved keys from the table properties via ALTER TABLE unset / updateProperties","Create such bridging tables only in non-iceberg catalogs and never copy their options across catalogs"],"exampleFix":"// before\nString ddl = \"CREATE TABLE t WITH ('connector'='iceberg', 'iceberg.catalog'='...')\";\n// after (in iceberg catalog)\nString ddl = \"CREATE TABLE t\"; // no connector-related options","handlingStrategy":"validation","validationCode":"Map<String,String> props = table.properties();\nif (props.containsKey(\"connector-type\") || props.containsKey(\"src-catalog\")) {\n  throw new IllegalArgumentException(\"Table carries reserved Flink bridging property keys\");\n}","typeGuard":"null","tryCatchPattern":"try { catalog.getTable(path); } catch (IllegalArgumentException e) { /* fix properties via table updateProperties */ }","preventionTips":["Never persist connector options into Iceberg table properties","Create bridging tables only in non-iceberg catalogs","Audit copied table metadata when moving tables between catalogs"],"tags":["flink","iceberg-catalog","reserved-property","table-properties"],"backgroundTag":"invalid-argument-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}