{"record":{"id":"600a694a6f9a5846","repo":"risingwavelabs/risingwave","slug":"loading-uncommitted-table-is-not-supported","errorCode":null,"errorMessage":"Loading uncommitted table is not supported!","messagePattern":"Loading uncommitted table is not supported!","errorType":"exception","errorClass":"iceberg::Error (ErrorKind::FeatureUnsupported)","httpStatus":null,"severity":"error","filePath":"src/connector/src/connector_common/iceberg/jni_catalog.rs","lineNumber":314,"sourceCode":"                let namespace_jstr = env.new_string(&namespace_str).unwrap();\n\n                let creation_str = serde_json::to_string(&CreateTableRequest::from(&creation))?;\n\n                let creation_jstr = env.new_string(&creation_str).unwrap();\n\n                let result_json =\n                    call_method!(env, inner.java_catalog.as_obj(), {String createTable(String, String)},\n                    &namespace_jstr, &creation_jstr)\n                    .with_context(|| {\n                        format!(\"Failed to create iceberg table: {}\", creation.name)\n                    })?;\n\n                let rust_json_str = jobj_to_str(env, result_json)?;\n\n                let resp: LoadTableResponse = serde_json::from_str(&rust_json_str)?;\n\n                let _metadata_location = resp.metadata_location.ok_or_else(|| {\n                    iceberg::Error::new(\n                        iceberg::ErrorKind::FeatureUnsupported,\n                        \"Loading uncommitted table is not supported!\",\n                    )\n                })?;\n\n                let table_metadata = resp.metadata;\n\n                let file_io =\n                    FileIOBuilder::new(Arc::new(OpenDalResolvingStorageFactory::new()))\n                    .with_props(file_io_props.iter())\n                    .build();\n\n                Ok(Table::builder()\n                    .file_io(file_io)\n                    .identifier(TableIdent::new(namespace, creation.name))\n                    .metadata(table_metadata)\n                    .runtime(runtime)\n                    .build())","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/connector_common/iceberg/jni_catalog.rs#L296-L332","documentation":"After creating a table through the JNI catalog, `JniCatalog::create_table` deserializes a `LoadTableResponse` from the Java side. The response must include `metadata_location`; if it is `None`, the table exists but was never committed (no metadata location), so the code raises an iceberg `FeatureUnsupported` error because loading uncommitted tables is not supported.","triggerScenarios":"create_table on a JNI catalog where the Java catalog returns a LoadTableResponse without `metadata_location` — e.g. a table that was created but whose creation transaction never committed, or a staged/uncommitted table response.","commonSituations":"A leftover partially-created table from a previous failed CREATE operation; concurrent creation where the response reflects a staged table; catalog backends that return staged responses instead of erroring.","solutions":["Drop the leftover uncommitted table in the catalog backend and recreate it.","Retry CREATE after cleaning up the stale table entry.","Check the Java catalog logs to see why the table creation did not commit a metadata location.","Use a catalog backend whose create flow always commits metadata before responding."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Before create, check the table doesn't already exist as an uncommitted leftover\nif catalog.table_exists(&ident).await? {\n    return Err(format!(\"table {:?} already exists; drop the stale entry first\", ident));\n}","typeGuard":null,"tryCatchPattern":"match catalog.create_table(&ns, ident, schema).await {\n    Err(e) if e.message().contains(\"uncommitted\") => {\n        // drop the stale/uncommitted table in the backend, then retry once\n    }\n    other => other?,\n}","preventionTips":["Clean up partially-created tables after failed CREATE operations.","Avoid concurrent creation of the same table; serialize DDL.","Check table existence before create for idempotent pipelines."],"tags":["iceberg","jni","table","uncommitted"],"backgroundTag":"unsupported-operation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}