dramaticlly commented on code in PR #12228: URL: https://github.com/apache/iceberg/pull/12228#discussion_r2073750507
########## core/src/main/java/org/apache/iceberg/BaseMetastoreCatalog.java: ########## @@ -71,23 +70,35 @@ public Table loadTable(TableIdentifier identifier) { } @Override - public Table registerTable(TableIdentifier identifier, String metadataFileLocation) { + public Table registerTable( + TableIdentifier identifier, String metadataFileLocation, boolean overwrite) { Preconditions.checkArgument( identifier != null && isValidIdentifier(identifier), "Invalid identifier: %s", identifier); Preconditions.checkArgument( metadataFileLocation != null && !metadataFileLocation.isEmpty(), "Cannot register an empty metadata file location as a table"); - // Throw an exception if this table already exists in the catalog. - if (tableExists(identifier)) { + // If the table already exists and overwriting is disabled, throw an exception. + if (tableExists(identifier) && !overwrite) { throw new AlreadyExistsException("Table already exists: %s", identifier); } TableOperations ops = newTableOps(identifier); - InputFile metadataFile = ops.io().newInputFile(metadataFileLocation); - TableMetadata metadata = TableMetadataParser.read(ops.io(), metadataFile); - ops.commit(null, metadata); - + TableMetadata newMetadata = + TableMetadataParser.read(ops.io(), ops.io().newInputFile(metadataFileLocation)); + + TableMetadata existing = ops.current(); + if (existing != null && overwrite) { + if (existing.metadataFileLocation().equals(metadataFileLocation)) { + LOG.info( + "The requested metadata matches the existing metadata. No changes will be committed."); + return new BaseTable(ops, fullTableName(name(), identifier), metricsReporter()); + } + dropTable(identifier, false /* Keep all data and metadata files */); Review Comment: Sorry for the delayed response. Let's say original table with identifier `mytable` and state A is represented by A.metadata.json and now we are registering with B.metadata.json. There's no guarantee that A and B has anything in common. Probably because we are looking from different angles, While the underlying storage state may remain unchanged during a register-table operation, the perception of the table can shift significantly. From a data consumer’s standpoint, if the identifier `mytable` now references a different collection of data due to registration with the overwrite flag, its internal state—including metadata, schema, partitioning, and data—may have changed entirely. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For additional commands, e-mail: issues-h...@iceberg.apache.org