diff --git a/.github/workflows/flink-ci.yml b/.github/workflows/flink-ci.yml
index 30fe6c7723bc..702ae9bc898d 100644
--- a/.github/workflows/flink-ci.yml
+++ b/.github/workflows/flink-ci.yml
@@ -60,7 +60,7 @@ jobs:
strategy:
matrix:
jvm: [8, 11]
- flink: ['1.15', '1.16', '1.17']
+ flink: ['1.16', '1.17', '1.18']
env:
SPARK_LOCAL_IP: localhost
steps:
diff --git a/dev/stage-binaries.sh b/dev/stage-binaries.sh
index 8b7b3d30aa26..5509a2ea3223 100755
--- a/dev/stage-binaries.sh
+++ b/dev/stage-binaries.sh
@@ -19,7 +19,7 @@
#
SCALA_VERSION=2.12
-FLINK_VERSIONS=1.15,1.16,1.17
+FLINK_VERSIONS=1.16,1.17,1.18
SPARK_VERSIONS=3.2,3.3,3.4,3.5
HIVE_VERSIONS=2,3
diff --git a/flink/build.gradle b/flink/build.gradle
index 33c2be904546..a33fc84e5727 100644
--- a/flink/build.gradle
+++ b/flink/build.gradle
@@ -19,10 +19,6 @@
def flinkVersions = (System.getProperty("flinkVersions") != null ? System.getProperty("flinkVersions") : System.getProperty("defaultFlinkVersions")).split(",")
-if (flinkVersions.contains("1.15")) {
- apply from: file("$projectDir/v1.15/build.gradle")
-}
-
if (flinkVersions.contains("1.16")) {
apply from: file("$projectDir/v1.16/build.gradle")
}
@@ -30,3 +26,7 @@ if (flinkVersions.contains("1.16")) {
if (flinkVersions.contains("1.17")) {
apply from: file("$projectDir/v1.17/build.gradle")
}
+
+if (flinkVersions.contains("1.18")) {
+ apply from: file("$projectDir/v1.18/build.gradle")
+}
diff --git a/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java b/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
index aa4b9cd79e55..0bb2eb7766e9 100644
--- a/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
+++ b/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
@@ -40,7 +40,6 @@
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.configuration.Configuration;
-import org.apache.flink.configuration.CoreOptions;
import org.apache.flink.core.execution.JobClient;
import org.apache.flink.metrics.Gauge;
import org.apache.flink.runtime.metrics.MetricNames;
@@ -93,10 +92,7 @@ public class TestIcebergSourceWithWatermarkExtractor implements Serializable {
.setNumberTaskManagers(1)
.setNumberSlotsPerTaskManager(PARALLELISM)
.setRpcServiceSharing(RpcServiceSharing.DEDICATED)
- .setConfiguration(
- reporter.addToConfiguration(
- // disable classloader check as Avro may cache class in the serializers.
- new Configuration().set(CoreOptions.CHECK_LEAKED_CLASSLOADER, false)))
+ .setConfiguration(reporter.addToConfiguration(new Configuration()))
.withHaLeadershipControl()
.build());
diff --git a/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java b/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
index f19d57083b89..88234c61123f 100644
--- a/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
+++ b/flink/v1.17/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
@@ -132,7 +132,7 @@ private void testOneSplitFetcher(
ReaderUtil.createCombinedScanTask(
recordBatchList, TEMPORARY_FOLDER, FileFormat.PARQUET, appenderFactory);
IcebergSourceSplit split = IcebergSourceSplit.fromCombinedScanTask(task);
- reader.addSplits(Collections.singletonList(split));
+ reader.addSplits(Arrays.asList(split));
while (readerOutput.getEmittedRecords().size() < expectedCount) {
reader.pollNext(readerOutput);
diff --git a/flink/v1.15/build.gradle b/flink/v1.18/build.gradle
similarity index 91%
rename from flink/v1.15/build.gradle
rename to flink/v1.18/build.gradle
index a77ec1b50ab3..55578d3b117d 100644
--- a/flink/v1.15/build.gradle
+++ b/flink/v1.18/build.gradle
@@ -17,7 +17,7 @@
* under the License.
*/
-String flinkMajorVersion = '1.15'
+String flinkMajorVersion = '1.18'
String scalaVersion = System.getProperty("scalaVersion") != null ? System.getProperty("scalaVersion") : System.getProperty("defaultScalaVersion")
project(":iceberg-flink:iceberg-flink-${flinkMajorVersion}") {
@@ -32,15 +32,15 @@ project(":iceberg-flink:iceberg-flink-${flinkMajorVersion}") {
implementation project(':iceberg-parquet')
implementation project(':iceberg-hive-metastore')
- compileOnly libs.flink115.avro
+ compileOnly libs.flink118.avro
// for dropwizard histogram metrics implementation
- compileOnly libs.flink115.metrics.dropwizard
- compileOnly libs.flink115.streaming.java
- compileOnly "${libs.flink115.streaming.java.get().module}:${libs.flink115.streaming.java.get().getVersion()}:tests"
- compileOnly libs.flink115.table.api.java.bridge
- compileOnly "org.apache.flink:flink-table-planner_${scalaVersion}:${libs.versions.flink115.get()}"
- compileOnly libs.flink115.connector.base
- compileOnly libs.flink115.connector.files
+ compileOnly libs.flink118.metrics.dropwizard
+ compileOnly libs.flink118.streaming.java
+ compileOnly "${libs.flink118.streaming.java.get().module}:${libs.flink118.streaming.java.get().getVersion()}:tests"
+ compileOnly libs.flink118.table.api.java.bridge
+ compileOnly "org.apache.flink:flink-table-planner_${scalaVersion}:${libs.versions.flink118.get()}"
+ compileOnly libs.flink118.connector.base
+ compileOnly libs.flink118.connector.files
compileOnly libs.hadoop2.hdfs
compileOnly libs.hadoop2.common
@@ -65,13 +65,13 @@ project(":iceberg-flink:iceberg-flink-${flinkMajorVersion}") {
exclude group: 'org.apache.hive', module: 'hive-storage-api'
}
- testImplementation libs.flink115.connector.test.utils
- testImplementation libs.flink115.core
- testImplementation libs.flink115.runtime
- testImplementation(libs.flink115.test.utilsjunit) {
+ testImplementation libs.flink118.connector.test.utils
+ testImplementation libs.flink118.core
+ testImplementation libs.flink118.runtime
+ testImplementation(libs.flink118.test.utilsjunit) {
exclude group: 'junit'
}
- testImplementation(libs.flink115.test.utils) {
+ testImplementation(libs.flink118.test.utils) {
exclude group: "org.apache.curator", module: 'curator-test'
exclude group: 'junit'
}
@@ -164,7 +164,7 @@ project(":iceberg-flink:iceberg-flink-runtime-${flinkMajorVersion}") {
}
// for dropwizard histogram metrics implementation
- implementation libs.flink115.metrics.dropwizard
+ implementation libs.flink118.metrics.dropwizard
// for integration testing with the flink-runtime-jar
// all of those dependencies are required because the integration test extends FlinkTestBase
@@ -174,13 +174,13 @@ project(":iceberg-flink:iceberg-flink-runtime-${flinkMajorVersion}") {
integrationImplementation project(path: ":iceberg-flink:iceberg-flink-${flinkMajorVersion}", configuration: "testArtifacts")
integrationImplementation project(path: ':iceberg-api', configuration: 'testArtifacts')
integrationImplementation project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
- integrationImplementation(libs.flink115.test.utils) {
+ integrationImplementation(libs.flink118.test.utils) {
exclude group: "org.apache.curator", module: 'curator-test'
exclude group: 'junit'
}
- integrationImplementation libs.flink115.table.api.java.bridge
- integrationImplementation "org.apache.flink:flink-table-planner_${scalaVersion}:${libs.versions.flink115.get()}"
+ integrationImplementation libs.flink118.table.api.java.bridge
+ integrationImplementation "org.apache.flink:flink-table-planner_${scalaVersion}:${libs.versions.flink118.get()}"
integrationImplementation libs.hadoop2.common
integrationImplementation libs.hadoop2.hdfs
diff --git a/flink/v1.15/flink-runtime/LICENSE b/flink/v1.18/flink-runtime/LICENSE
similarity index 100%
rename from flink/v1.15/flink-runtime/LICENSE
rename to flink/v1.18/flink-runtime/LICENSE
diff --git a/flink/v1.15/flink-runtime/NOTICE b/flink/v1.18/flink-runtime/NOTICE
similarity index 100%
rename from flink/v1.15/flink-runtime/NOTICE
rename to flink/v1.18/flink-runtime/NOTICE
diff --git a/flink/v1.15/flink-runtime/src/integration/java/org/apache/iceberg/flink/IcebergConnectorSmokeTest.java b/flink/v1.18/flink-runtime/src/integration/java/org/apache/iceberg/flink/IcebergConnectorSmokeTest.java
similarity index 100%
rename from flink/v1.15/flink-runtime/src/integration/java/org/apache/iceberg/flink/IcebergConnectorSmokeTest.java
rename to flink/v1.18/flink-runtime/src/integration/java/org/apache/iceberg/flink/IcebergConnectorSmokeTest.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/CatalogLoader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/CatalogLoader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/CatalogLoader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/CatalogLoader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java
similarity index 89%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java
index 825816fdf416..f022c8abcb00 100644
--- a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalog.java
@@ -38,6 +38,7 @@
import org.apache.flink.table.catalog.CatalogTable;
import org.apache.flink.table.catalog.CatalogTableImpl;
import org.apache.flink.table.catalog.ObjectPath;
+import org.apache.flink.table.catalog.TableChange;
import org.apache.flink.table.catalog.exceptions.CatalogException;
import org.apache.flink.table.catalog.exceptions.DatabaseAlreadyExistException;
import org.apache.flink.table.catalog.exceptions.DatabaseNotEmptyException;
@@ -60,8 +61,6 @@
import org.apache.iceberg.Schema;
import org.apache.iceberg.StructLike;
import org.apache.iceberg.Table;
-import org.apache.iceberg.Transaction;
-import org.apache.iceberg.UpdateProperties;
import org.apache.iceberg.catalog.Catalog;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.SupportsNamespaces;
@@ -69,6 +68,7 @@
import org.apache.iceberg.exceptions.AlreadyExistsException;
import org.apache.iceberg.exceptions.NamespaceNotEmptyException;
import org.apache.iceberg.exceptions.NoSuchNamespaceException;
+import org.apache.iceberg.flink.util.FlinkAlterTableUtil;
import org.apache.iceberg.flink.util.FlinkCompatibilityUtil;
import org.apache.iceberg.io.CloseableIterable;
import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
@@ -91,7 +91,6 @@
* independent of the partition of Flink.
*/
public class FlinkCatalog extends AbstractCatalog {
-
private final CatalogLoader catalogLoader;
private final Catalog icebergCatalog;
private final Namespace baseNamespace;
@@ -439,14 +438,35 @@ private static void validateTableSchemaAndPartition(CatalogTable ct1, CatalogTab
if (!(Objects.equals(ts1.getTableColumns(), ts2.getTableColumns())
&& Objects.equals(ts1.getWatermarkSpecs(), ts2.getWatermarkSpecs())
&& equalsPrimary)) {
- throw new UnsupportedOperationException("Altering schema is not supported yet.");
+ throw new UnsupportedOperationException(
+ "Altering schema is not supported in the old alterTable API. "
+ + "To alter schema, use the other alterTable API and provide a list of TableChange's.");
}
+ validateTablePartition(ct1, ct2);
+ }
+
+ private static void validateTablePartition(CatalogTable ct1, CatalogTable ct2) {
if (!ct1.getPartitionKeys().equals(ct2.getPartitionKeys())) {
throw new UnsupportedOperationException("Altering partition keys is not supported yet.");
}
}
+ /**
+ * This alterTable API only supports altering table properties.
+ *
+ *
Support for adding/removing/renaming columns cannot be done by comparing CatalogTable
+ * instances, unless the Flink schema contains Iceberg column IDs.
+ *
+ *
To alter columns, use the other alterTable API and provide a list of TableChange's.
+ *
+ * @param tablePath path of the table or view to be modified
+ * @param newTable the new table definition
+ * @param ignoreIfNotExists flag to specify behavior when the table or view does not exist: if set
+ * to false, throw an exception, if set to true, do nothing.
+ * @throws CatalogException in case of any runtime exception
+ * @throws TableNotExistException if the table does not exist
+ */
@Override
public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean ignoreIfNotExists)
throws CatalogException, TableNotExistException {
@@ -464,12 +484,6 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean
}
CatalogTable table = toCatalogTable(icebergTable);
-
- // Currently, Flink SQL only support altering table properties.
-
- // For current Flink Catalog API, support for adding/removing/renaming columns cannot be done by
- // comparing
- // CatalogTable instances, unless the Flink schema contains Iceberg column IDs.
validateTableSchemaAndPartition(table, (CatalogTable) newTable);
Map oldProperties = table.getOptions();
@@ -507,7 +521,66 @@ public void alterTable(ObjectPath tablePath, CatalogBaseTable newTable, boolean
}
});
- commitChanges(icebergTable, setLocation, setSnapshotId, pickSnapshotId, setProperties);
+ FlinkAlterTableUtil.commitChanges(
+ icebergTable, setLocation, setSnapshotId, pickSnapshotId, setProperties);
+ }
+
+ @Override
+ public void alterTable(
+ ObjectPath tablePath,
+ CatalogBaseTable newTable,
+ List tableChanges,
+ boolean ignoreIfNotExists)
+ throws TableNotExistException, CatalogException {
+ validateFlinkTable(newTable);
+
+ Table icebergTable;
+ try {
+ icebergTable = loadIcebergTable(tablePath);
+ } catch (TableNotExistException e) {
+ if (!ignoreIfNotExists) {
+ throw e;
+ } else {
+ return;
+ }
+ }
+
+ // Does not support altering partition yet.
+ validateTablePartition(toCatalogTable(icebergTable), (CatalogTable) newTable);
+
+ String setLocation = null;
+ String setSnapshotId = null;
+ String cherrypickSnapshotId = null;
+
+ List propertyChanges = Lists.newArrayList();
+ List schemaChanges = Lists.newArrayList();
+ for (TableChange change : tableChanges) {
+ if (change instanceof TableChange.SetOption) {
+ TableChange.SetOption set = (TableChange.SetOption) change;
+
+ if ("location".equalsIgnoreCase(set.getKey())) {
+ setLocation = set.getValue();
+ } else if ("current-snapshot-id".equalsIgnoreCase(set.getKey())) {
+ setSnapshotId = set.getValue();
+ } else if ("cherry-pick-snapshot-id".equalsIgnoreCase(set.getKey())) {
+ cherrypickSnapshotId = set.getValue();
+ } else {
+ propertyChanges.add(change);
+ }
+ } else if (change instanceof TableChange.ResetOption) {
+ propertyChanges.add(change);
+ } else {
+ schemaChanges.add(change);
+ }
+ }
+
+ FlinkAlterTableUtil.commitChanges(
+ icebergTable,
+ setLocation,
+ setSnapshotId,
+ cherrypickSnapshotId,
+ schemaChanges,
+ propertyChanges);
}
private static void validateFlinkTable(CatalogBaseTable table) {
@@ -552,52 +625,6 @@ private static List toPartitionKeys(PartitionSpec spec, Schema icebergSc
return partitionKeysBuilder.build();
}
- private static void commitChanges(
- Table table,
- String setLocation,
- String setSnapshotId,
- String pickSnapshotId,
- Map setProperties) {
- // don't allow setting the snapshot and picking a commit at the same time because order is
- // ambiguous and choosing
- // one order leads to different results
- Preconditions.checkArgument(
- setSnapshotId == null || pickSnapshotId == null,
- "Cannot set the current snapshot ID and cherry-pick snapshot changes");
-
- if (setSnapshotId != null) {
- long newSnapshotId = Long.parseLong(setSnapshotId);
- table.manageSnapshots().setCurrentSnapshot(newSnapshotId).commit();
- }
-
- // if updating the table snapshot, perform that update first in case it fails
- if (pickSnapshotId != null) {
- long newSnapshotId = Long.parseLong(pickSnapshotId);
- table.manageSnapshots().cherrypick(newSnapshotId).commit();
- }
-
- Transaction transaction = table.newTransaction();
-
- if (setLocation != null) {
- transaction.updateLocation().setLocation(setLocation).commit();
- }
-
- if (!setProperties.isEmpty()) {
- UpdateProperties updateProperties = transaction.updateProperties();
- setProperties.forEach(
- (k, v) -> {
- if (v == null) {
- updateProperties.remove(k);
- } else {
- updateProperties.set(k, v);
- }
- });
- updateProperties.commit();
- }
-
- transaction.commitTransaction();
- }
-
static CatalogTable toCatalogTable(Table table) {
TableSchema schema = FlinkSchemaUtil.toSchema(table.schema());
List partitionKeys = toPartitionKeys(table.spec(), table.schema());
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalogFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalogFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalogFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkCatalogFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkConfParser.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkConfParser.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkConfParser.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkConfParser.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkConfigOptions.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkConfigOptions.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkConfigOptions.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkConfigOptions.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkDynamicTableFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkDynamicTableFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkDynamicTableFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkDynamicTableFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkEnvironmentContext.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkEnvironmentContext.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkEnvironmentContext.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkEnvironmentContext.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkFilters.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkFilters.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkFilters.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkFilters.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkFixupTypes.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkFixupTypes.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkFixupTypes.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkFixupTypes.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkReadConf.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkReadConf.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkReadConf.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkReadConf.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkReadOptions.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkReadOptions.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkReadOptions.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkReadOptions.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java
similarity index 96%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java
index 25725639c330..a6b53879ad80 100644
--- a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkSchemaUtil.java
@@ -134,6 +134,16 @@ public static LogicalType convert(Type type) {
return TypeUtil.visit(type, new TypeToFlinkType());
}
+ /**
+ * Convert a {@link LogicalType Flink type} to a {@link Type}.
+ *
+ * @param flinkType a FlinkType
+ * @return the equivalent Iceberg type
+ */
+ public static Type convert(LogicalType flinkType) {
+ return flinkType.accept(new FlinkTypeToType());
+ }
+
/**
* Convert a {@link RowType} to a {@link TableSchema}.
*
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkSourceFilter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkSourceFilter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkSourceFilter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkSourceFilter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java
similarity index 99%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java
index 6f8bfef2ef44..408065f06057 100644
--- a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeToType.java
@@ -49,6 +49,10 @@ class FlinkTypeToType extends FlinkTypeVisitor {
private final RowType root;
private int nextId;
+ FlinkTypeToType() {
+ this.root = null;
+ }
+
FlinkTypeToType(RowType root) {
this.root = root;
// the root struct's fields use the first ids
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkTypeVisitor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteConf.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteConf.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteConf.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteConf.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteOptions.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteOptions.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteOptions.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/FlinkWriteOptions.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/IcebergTableSink.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/IcebergTableSink.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/IcebergTableSink.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/IcebergTableSink.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/RowDataWrapper.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/TableLoader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/TableLoader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/TableLoader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/TableLoader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/TypeToFlinkType.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/TypeToFlinkType.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/TypeToFlinkType.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/TypeToFlinkType.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/actions/Actions.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/actions/Actions.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/actions/Actions.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/actions/Actions.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/actions/RewriteDataFilesAction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/actions/RewriteDataFilesAction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/actions/RewriteDataFilesAction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/actions/RewriteDataFilesAction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/AvroWithFlinkSchemaVisitor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/AvroWithFlinkSchemaVisitor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/AvroWithFlinkSchemaVisitor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/AvroWithFlinkSchemaVisitor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkAvroWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcReaders.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriters.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriters.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkOrcWriters.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetReaders.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetWriters.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetWriters.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkParquetWriters.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkSchemaVisitor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkSchemaVisitor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkSchemaVisitor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkSchemaVisitor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueReaders.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueReaders.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueReaders.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueReaders.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueWriters.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueWriters.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/FlinkValueWriters.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/ParquetWithFlinkSchemaVisitor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/ParquetWithFlinkSchemaVisitor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/ParquetWithFlinkSchemaVisitor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/ParquetWithFlinkSchemaVisitor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/RowDataProjection.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/RowDataProjection.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/RowDataProjection.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/RowDataProjection.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/RowDataUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/RowDataUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/RowDataUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/RowDataUtil.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/StructRowData.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/StructRowData.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/data/StructRowData.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/data/StructRowData.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/AvroGenericRecordToRowDataMapper.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/AvroGenericRecordToRowDataMapper.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/AvroGenericRecordToRowDataMapper.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/AvroGenericRecordToRowDataMapper.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BaseDeltaTaskWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BaseDeltaTaskWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BaseDeltaTaskWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BaseDeltaTaskWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionKeySelector.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionKeySelector.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionKeySelector.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionKeySelector.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitioner.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitioner.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitioner.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitioner.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionerUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionerUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionerUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/BucketPartitionerUtil.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/CachingTableSupplier.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/CachingTableSupplier.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/CachingTableSupplier.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/CachingTableSupplier.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/CommitSummary.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/CommitSummary.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/CommitSummary.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/CommitSummary.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifests.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifests.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifests.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifests.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifestsSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifestsSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifestsSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/DeltaManifestsSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/EqualityFieldKeySelector.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/EqualityFieldKeySelector.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/EqualityFieldKeySelector.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/EqualityFieldKeySelector.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkAppenderFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkAppenderFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkAppenderFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkAppenderFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkFileWriterFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkFileWriterFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkFileWriterFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkFileWriterFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkManifestUtil.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkSink.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkSink.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkSink.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/FlinkSink.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitterMetrics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitterMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitterMetrics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergFilesCommitterMetrics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriterMetrics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriterMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriterMetrics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/IcebergStreamWriterMetrics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/ManifestOutputFileFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/ManifestOutputFileFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/ManifestOutputFileFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/ManifestOutputFileFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionKeySelector.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionKeySelector.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionKeySelector.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionKeySelector.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionedDeltaWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionedDeltaWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionedDeltaWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/PartitionedDeltaWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/RowDataTaskWriterFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/RowDataTaskWriterFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/RowDataTaskWriterFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/RowDataTaskWriterFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/TaskWriterFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/TaskWriterFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/TaskWriterFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/TaskWriterFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/UnpartitionedDeltaWriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/UnpartitionedDeltaWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/UnpartitionedDeltaWriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/UnpartitionedDeltaWriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatistics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatistics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatistics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatistics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatisticsTracker.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatisticsTracker.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatisticsTracker.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/AggregatedStatisticsTracker.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatistics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatistics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatistics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatistics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java
similarity index 74%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java
index 26fb3c328481..c8ac79c61bf6 100644
--- a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinator.java
@@ -18,6 +18,7 @@
*/
package org.apache.iceberg.flink.sink.shuffle;
+import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@@ -35,6 +36,8 @@
import org.apache.flink.util.ThrowableCatchingRunnable;
import org.apache.flink.util.function.ThrowingRunnable;
import org.apache.iceberg.relocated.com.google.common.annotations.VisibleForTesting;
+import org.apache.iceberg.relocated.com.google.common.collect.Iterables;
+import org.apache.iceberg.relocated.com.google.common.collect.Maps;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
@@ -54,7 +57,7 @@ class DataStatisticsCoordinator, S> implements Op
private final String operatorName;
private final ExecutorService coordinatorExecutor;
private final OperatorCoordinator.Context operatorCoordinatorContext;
- private final OperatorCoordinator.SubtaskGateway[] subtaskGateways;
+ private final SubtaskGateways subtaskGateways;
private final CoordinatorExecutorThreadFactory coordinatorThreadFactory;
private final TypeSerializer> statisticsSerializer;
private final transient AggregatedStatisticsTracker aggregatedStatisticsTracker;
@@ -71,8 +74,7 @@ class DataStatisticsCoordinator, S> implements Op
"DataStatisticsCoordinator-" + operatorName, context.getUserCodeClassloader());
this.coordinatorExecutor = Executors.newSingleThreadExecutor(coordinatorThreadFactory);
this.operatorCoordinatorContext = context;
- this.subtaskGateways =
- new OperatorCoordinator.SubtaskGateway[operatorCoordinatorContext.currentParallelism()];
+ this.subtaskGateways = new SubtaskGateways(operatorName, parallelism());
this.statisticsSerializer = statisticsSerializer;
this.aggregatedStatisticsTracker =
new AggregatedStatisticsTracker<>(operatorName, statisticsSerializer, parallelism());
@@ -170,6 +172,7 @@ private void handleDataStatisticRequest(int subtask, DataStatisticsEvent e
}
}
+ @SuppressWarnings("FutureReturnValueIgnored")
private void sendDataStatisticsToSubtasks(
long checkpointId, DataStatistics globalDataStatistics) {
callInCoordinatorThread(
@@ -178,7 +181,7 @@ private void sendDataStatisticsToSubtasks(
DataStatisticsEvent.create(checkpointId, globalDataStatistics, statisticsSerializer);
int parallelism = parallelism();
for (int i = 0; i < parallelism; ++i) {
- subtaskGateways[i].sendEvent(dataStatisticsEvent);
+ subtaskGateways.getSubtaskGateway(i).sendEvent(dataStatisticsEvent);
}
return null;
@@ -189,14 +192,22 @@ private void sendDataStatisticsToSubtasks(
}
@Override
- public void handleEventFromOperator(int subtask, OperatorEvent event) throws Exception {
+ @SuppressWarnings("unchecked")
+ public void handleEventFromOperator(int subtask, int attemptNumber, OperatorEvent event) {
runInCoordinatorThread(
() -> {
- LOG.debug("Handling event from subtask {} of {}: {}", subtask, operatorName, event);
+ LOG.debug(
+ "Handling event from subtask {} (#{}) of {}: {}",
+ subtask,
+ attemptNumber,
+ operatorName,
+ event);
Preconditions.checkArgument(event instanceof DataStatisticsEvent);
handleDataStatisticRequest(subtask, ((DataStatisticsEvent) event));
},
- String.format("handling operator event %s from subtask %d", event.getClass(), subtask));
+ String.format(
+ "handling operator event %s from subtask %d (#%d)",
+ event.getClass(), subtask, attemptNumber));
}
@Override
@@ -238,39 +249,49 @@ public void resetToCheckpoint(long checkpointId, @Nullable byte[] checkpointData
}
@Override
- public void subtaskFailed(int subtask, @Nullable Throwable reason) {
+ public void subtaskReset(int subtask, long checkpointId) {
runInCoordinatorThread(
() -> {
LOG.info(
- "Unregistering gateway after failure for subtask {} of data statistic {}",
+ "Operator {} subtask {} is reset to checkpoint {}",
+ operatorName,
subtask,
- operatorName);
+ checkpointId);
Preconditions.checkState(
this.coordinatorThreadFactory.isCurrentThreadCoordinatorThread());
- subtaskGateways[subtask] = null;
+ subtaskGateways.reset(subtask);
},
- String.format("handling subtask %d failure", subtask));
+ String.format("handling subtask %d recovery to checkpoint %d", subtask, checkpointId));
}
@Override
- public void subtaskReset(int subtask, long checkpointId) {
- LOG.info(
- "Data statistic coordinator {} subtask {} is reset to checkpoint {}",
- operatorName,
- subtask,
- checkpointId);
+ public void executionAttemptFailed(int subtask, int attemptNumber, @Nullable Throwable reason) {
+ runInCoordinatorThread(
+ () -> {
+ LOG.info(
+ "Unregistering gateway after failure for subtask {} (#{}) of data statistic {}",
+ subtask,
+ attemptNumber,
+ operatorName);
+ Preconditions.checkState(
+ this.coordinatorThreadFactory.isCurrentThreadCoordinatorThread());
+ subtaskGateways.unregisterSubtaskGateway(subtask, attemptNumber);
+ },
+ String.format("handling subtask %d (#%d) failure", subtask, attemptNumber));
}
@Override
- public void subtaskReady(int subtask, SubtaskGateway gateway) {
+ public void executionAttemptReady(int subtask, int attemptNumber, SubtaskGateway gateway) {
Preconditions.checkArgument(subtask == gateway.getSubtask());
+ Preconditions.checkArgument(attemptNumber == gateway.getExecution().getAttemptNumber());
runInCoordinatorThread(
() -> {
Preconditions.checkState(
this.coordinatorThreadFactory.isCurrentThreadCoordinatorThread());
- subtaskGateways[subtask] = gateway;
+ subtaskGateways.registerSubtaskGateway(gateway);
},
- String.format("making event gateway to subtask %d available", subtask));
+ String.format(
+ "making event gateway to subtask %d (#%d) available", subtask, attemptNumber));
}
@VisibleForTesting
@@ -278,6 +299,59 @@ AggregatedStatistics completedStatistics() {
return completedStatistics;
}
+ private static class SubtaskGateways {
+ private final String operatorName;
+ private final Map[] gateways;
+
+ private SubtaskGateways(String operatorName, int parallelism) {
+ this.operatorName = operatorName;
+ gateways = new Map[parallelism];
+
+ for (int i = 0; i < parallelism; ++i) {
+ gateways[i] = Maps.newHashMap();
+ }
+ }
+
+ private void registerSubtaskGateway(OperatorCoordinator.SubtaskGateway gateway) {
+ int subtaskIndex = gateway.getSubtask();
+ int attemptNumber = gateway.getExecution().getAttemptNumber();
+ Preconditions.checkState(
+ !gateways[subtaskIndex].containsKey(attemptNumber),
+ "Coordinator of %s already has a subtask gateway for %d (#%d)",
+ operatorName,
+ subtaskIndex,
+ attemptNumber);
+ LOG.debug(
+ "Coordinator of {} registers gateway for subtask {} attempt {}",
+ operatorName,
+ subtaskIndex,
+ attemptNumber);
+ gateways[subtaskIndex].put(attemptNumber, gateway);
+ }
+
+ private void unregisterSubtaskGateway(int subtaskIndex, int attemptNumber) {
+ LOG.debug(
+ "Coordinator of {} unregisters gateway for subtask {} attempt {}",
+ operatorName,
+ subtaskIndex,
+ attemptNumber);
+ gateways[subtaskIndex].remove(attemptNumber);
+ }
+
+ private OperatorCoordinator.SubtaskGateway getSubtaskGateway(int subtaskIndex) {
+ Preconditions.checkState(
+ !gateways[subtaskIndex].isEmpty(),
+ "Coordinator of %s subtask %d is not ready yet to receive events",
+ operatorName,
+ subtaskIndex);
+ return Iterables.getOnlyElement(gateways[subtaskIndex].values());
+ }
+
+ private void reset(int subtaskIndex) {
+ gateways[subtaskIndex].clear();
+ }
+ }
+
private static class CoordinatorExecutorThreadFactory
implements ThreadFactory, Thread.UncaughtExceptionHandler {
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinatorProvider.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinatorProvider.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinatorProvider.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsCoordinatorProvider.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsEvent.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsEvent.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsEvent.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsEvent.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOperator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOperator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOperator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOperator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecord.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecord.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecord.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecord.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecordSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecordSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecordSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsOrRecordSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/DataStatisticsUtil.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatistics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatistics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatistics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatistics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatisticsSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatisticsSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatisticsSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/sink/shuffle/MapDataStatisticsSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/AvroGenericRecordFileScanTaskReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/AvroGenericRecordFileScanTaskReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/AvroGenericRecordFileScanTaskReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/AvroGenericRecordFileScanTaskReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/DataIterator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/DataIterator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/DataIterator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/DataIterator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/DataTaskReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/DataTaskReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/DataTaskReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/DataTaskReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FileScanTaskReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FileScanTaskReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FileScanTaskReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FileScanTaskReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputFormat.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputFormat.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputFormat.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputFormat.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputSplit.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputSplit.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputSplit.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkInputSplit.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSource.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSource.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSource.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSource.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSplitPlanner.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSplitPlanner.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSplitPlanner.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/FlinkSplitPlanner.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/IcebergSource.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/IcebergSource.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/IcebergSource.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/IcebergSource.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/IcebergTableSource.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/IcebergTableSource.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/IcebergTableSource.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/IcebergTableSource.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataFileScanTaskReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataFileScanTaskReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataFileScanTaskReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataFileScanTaskReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataRewriter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataRewriter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataRewriter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataRewriter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataToAvroGenericRecordConverter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataToAvroGenericRecordConverter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/RowDataToAvroGenericRecordConverter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/RowDataToAvroGenericRecordConverter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/ScanContext.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/ScanContext.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/ScanContext.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/ScanContext.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/SourceUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/SourceUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/SourceUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/SourceUtil.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingMonitorFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingMonitorFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingMonitorFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingMonitorFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingReaderOperator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingReaderOperator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingReaderOperator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingReaderOperator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingStartingStrategy.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingStartingStrategy.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/StreamingStartingStrategy.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/StreamingStartingStrategy.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/DefaultSplitAssigner.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/DefaultSplitAssigner.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/DefaultSplitAssigner.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/DefaultSplitAssigner.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/GetSplitResult.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/GetSplitResult.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/GetSplitResult.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/GetSplitResult.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/OrderedSplitAssignerFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/OrderedSplitAssignerFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/OrderedSplitAssignerFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/OrderedSplitAssignerFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SimpleSplitAssignerFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SimpleSplitAssignerFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SimpleSplitAssignerFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SimpleSplitAssignerFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssigner.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssigner.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssigner.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssigner.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerType.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerType.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerType.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/assigner/SplitAssignerType.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/AbstractIcebergEnumerator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/AbstractIcebergEnumerator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/AbstractIcebergEnumerator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/AbstractIcebergEnumerator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousEnumerationResult.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousEnumerationResult.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousEnumerationResult.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousEnumerationResult.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousIcebergEnumerator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousIcebergEnumerator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousIcebergEnumerator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousIcebergEnumerator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlanner.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlanner.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlanner.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlanner.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlannerImpl.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlannerImpl.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlannerImpl.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/ContinuousSplitPlannerImpl.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/EnumerationHistory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/EnumerationHistory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/EnumerationHistory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/EnumerationHistory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPosition.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPosition.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPosition.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPosition.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPositionSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPositionSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPositionSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorPositionSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorState.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorState.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorState.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorState.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorStateSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorStateSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorStateSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/IcebergEnumeratorStateSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/StaticIcebergEnumerator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/StaticIcebergEnumerator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/StaticIcebergEnumerator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/enumerator/StaticIcebergEnumerator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayBatchRecords.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayBatchRecords.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayBatchRecords.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayBatchRecords.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayPoolDataIteratorBatcher.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayPoolDataIteratorBatcher.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayPoolDataIteratorBatcher.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ArrayPoolDataIteratorBatcher.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/AvroGenericRecordReaderFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/AvroGenericRecordReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/AvroGenericRecordReaderFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/AvroGenericRecordReaderFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ColumnStatsWatermarkExtractor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ColumnStatsWatermarkExtractor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ColumnStatsWatermarkExtractor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ColumnStatsWatermarkExtractor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorBatcher.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorBatcher.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorBatcher.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorBatcher.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorReaderFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorReaderFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/DataIteratorReaderFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReaderMetrics.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReaderMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReaderMetrics.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceReaderMetrics.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceSplitReader.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceSplitReader.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceSplitReader.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/IcebergSourceSplitReader.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListBatchRecords.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListBatchRecords.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListBatchRecords.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListBatchRecords.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListDataIteratorBatcher.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListDataIteratorBatcher.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListDataIteratorBatcher.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ListDataIteratorBatcher.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/MetaDataReaderFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/MetaDataReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/MetaDataReaderFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/MetaDataReaderFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ReaderFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/ReaderFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/ReaderFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordAndPosition.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordAndPosition.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordAndPosition.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordAndPosition.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RecordFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataReaderFunction.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataReaderFunction.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataReaderFunction.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataRecordFactory.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataRecordFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataRecordFactory.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/RowDataRecordFactory.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/SerializableRecordEmitter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/SerializableRecordEmitter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/SerializableRecordEmitter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/SerializableRecordEmitter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/SplitWatermarkExtractor.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/SplitWatermarkExtractor.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/SplitWatermarkExtractor.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/SplitWatermarkExtractor.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/WatermarkExtractorRecordEmitter.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/WatermarkExtractorRecordEmitter.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/reader/WatermarkExtractorRecordEmitter.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/reader/WatermarkExtractorRecordEmitter.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplit.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplit.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplit.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplit.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitSerializer.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitSerializer.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitSerializer.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitState.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitState.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitState.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitState.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitStatus.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitStatus.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitStatus.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/IcebergSourceSplitStatus.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SerializableComparator.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SerializableComparator.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SerializableComparator.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SerializableComparator.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitComparators.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitComparators.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitComparators.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitComparators.java
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitRequestEvent.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitRequestEvent.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitRequestEvent.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/source/split/SplitRequestEvent.java
diff --git a/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java
new file mode 100644
index 000000000000..f0b9bf64fb1a
--- /dev/null
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkAlterTableUtil.java
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iceberg.flink.util;
+
+import java.util.List;
+import java.util.Map;
+import org.apache.flink.table.catalog.Column;
+import org.apache.flink.table.catalog.TableChange;
+import org.apache.flink.table.catalog.UniqueConstraint;
+import org.apache.iceberg.Table;
+import org.apache.iceberg.Transaction;
+import org.apache.iceberg.UpdateProperties;
+import org.apache.iceberg.UpdateSchema;
+import org.apache.iceberg.flink.FlinkSchemaUtil;
+import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
+import org.apache.iceberg.types.Type;
+
+public class FlinkAlterTableUtil {
+ private FlinkAlterTableUtil() {}
+
+ public static void commitChanges(
+ Table table,
+ String setLocation,
+ String setSnapshotId,
+ String pickSnapshotId,
+ Map setProperties) {
+ commitManageSnapshots(table, setSnapshotId, pickSnapshotId);
+
+ Transaction transaction = table.newTransaction();
+
+ if (setLocation != null) {
+ transaction.updateLocation().setLocation(setLocation).commit();
+ }
+
+ if (!setProperties.isEmpty()) {
+ UpdateProperties updateProperties = transaction.updateProperties();
+ setProperties.forEach(
+ (k, v) -> {
+ if (v == null) {
+ updateProperties.remove(k);
+ } else {
+ updateProperties.set(k, v);
+ }
+ });
+ updateProperties.commit();
+ }
+
+ transaction.commitTransaction();
+ }
+
+ public static void commitChanges(
+ Table table,
+ String setLocation,
+ String setSnapshotId,
+ String pickSnapshotId,
+ List schemaChanges,
+ List propertyChanges) {
+ commitManageSnapshots(table, setSnapshotId, pickSnapshotId);
+
+ Transaction transaction = table.newTransaction();
+
+ if (setLocation != null) {
+ transaction.updateLocation().setLocation(setLocation).commit();
+ }
+
+ if (!schemaChanges.isEmpty()) {
+ UpdateSchema updateSchema = transaction.updateSchema();
+ FlinkAlterTableUtil.applySchemaChanges(updateSchema, schemaChanges);
+ updateSchema.commit();
+ }
+
+ if (!propertyChanges.isEmpty()) {
+ UpdateProperties updateProperties = transaction.updateProperties();
+ FlinkAlterTableUtil.applyPropertyChanges(updateProperties, propertyChanges);
+ updateProperties.commit();
+ }
+
+ transaction.commitTransaction();
+ }
+
+ public static void commitManageSnapshots(
+ Table table, String setSnapshotId, String cherrypickSnapshotId) {
+ // don't allow setting the snapshot and picking a commit at the same time because order is
+ // ambiguous and choosing one order leads to different results
+ Preconditions.checkArgument(
+ setSnapshotId == null || cherrypickSnapshotId == null,
+ "Cannot set the current snapshot ID and cherry-pick snapshot changes");
+
+ if (setSnapshotId != null) {
+ long newSnapshotId = Long.parseLong(setSnapshotId);
+ table.manageSnapshots().setCurrentSnapshot(newSnapshotId).commit();
+ }
+
+ // if updating the table snapshot, perform that update first in case it fails
+ if (cherrypickSnapshotId != null) {
+ long newSnapshotId = Long.parseLong(cherrypickSnapshotId);
+ table.manageSnapshots().cherrypick(newSnapshotId).commit();
+ }
+ }
+
+ /**
+ * Applies a list of Flink table changes to an {@link UpdateSchema} operation.
+ *
+ * @param pendingUpdate an uncommitted UpdateSchema operation to configure
+ * @param schemaChanges a list of Flink table changes
+ */
+ public static void applySchemaChanges(
+ UpdateSchema pendingUpdate, List schemaChanges) {
+ for (TableChange change : schemaChanges) {
+ if (change instanceof TableChange.AddColumn) {
+ TableChange.AddColumn addColumn = (TableChange.AddColumn) change;
+ Column flinkColumn = addColumn.getColumn();
+ Preconditions.checkArgument(
+ FlinkCompatibilityUtil.isPhysicalColumn(flinkColumn),
+ "Unsupported table change: Adding computed column %s.",
+ flinkColumn.getName());
+ Type icebergType = FlinkSchemaUtil.convert(flinkColumn.getDataType().getLogicalType());
+ if (flinkColumn.getDataType().getLogicalType().isNullable()) {
+ pendingUpdate.addColumn(flinkColumn.getName(), icebergType);
+ } else {
+ pendingUpdate.addRequiredColumn(flinkColumn.getName(), icebergType);
+ }
+ } else if (change instanceof TableChange.ModifyColumn) {
+ TableChange.ModifyColumn modifyColumn = (TableChange.ModifyColumn) change;
+ applyModifyColumn(pendingUpdate, modifyColumn);
+ } else if (change instanceof TableChange.DropColumn) {
+ TableChange.DropColumn dropColumn = (TableChange.DropColumn) change;
+ pendingUpdate.deleteColumn(dropColumn.getColumnName());
+ } else if (change instanceof TableChange.AddWatermark) {
+ throw new UnsupportedOperationException("Unsupported table change: AddWatermark.");
+ } else if (change instanceof TableChange.ModifyWatermark) {
+ throw new UnsupportedOperationException("Unsupported table change: ModifyWatermark.");
+ } else if (change instanceof TableChange.DropWatermark) {
+ throw new UnsupportedOperationException("Unsupported table change: DropWatermark.");
+ } else if (change instanceof TableChange.AddUniqueConstraint) {
+ TableChange.AddUniqueConstraint addPk = (TableChange.AddUniqueConstraint) change;
+ applyUniqueConstraint(pendingUpdate, addPk.getConstraint());
+ } else if (change instanceof TableChange.ModifyUniqueConstraint) {
+ TableChange.ModifyUniqueConstraint modifyPk = (TableChange.ModifyUniqueConstraint) change;
+ applyUniqueConstraint(pendingUpdate, modifyPk.getNewConstraint());
+ } else if (change instanceof TableChange.DropConstraint) {
+ throw new UnsupportedOperationException("Unsupported table change: DropConstraint.");
+ } else {
+ throw new UnsupportedOperationException("Cannot apply unknown table change: " + change);
+ }
+ }
+ }
+
+ /**
+ * Applies a list of Flink table property changes to an {@link UpdateProperties} operation.
+ *
+ * @param pendingUpdate an uncommitted UpdateProperty operation to configure
+ * @param propertyChanges a list of Flink table changes
+ */
+ public static void applyPropertyChanges(
+ UpdateProperties pendingUpdate, List propertyChanges) {
+ for (TableChange change : propertyChanges) {
+ if (change instanceof TableChange.SetOption) {
+ TableChange.SetOption setOption = (TableChange.SetOption) change;
+ pendingUpdate.set(setOption.getKey(), setOption.getValue());
+ } else if (change instanceof TableChange.ResetOption) {
+ TableChange.ResetOption resetOption = (TableChange.ResetOption) change;
+ pendingUpdate.remove(resetOption.getKey());
+ } else {
+ throw new UnsupportedOperationException(
+ "The given table change is not a property change: " + change);
+ }
+ }
+ }
+
+ private static void applyModifyColumn(
+ UpdateSchema pendingUpdate, TableChange.ModifyColumn modifyColumn) {
+ if (modifyColumn instanceof TableChange.ModifyColumnName) {
+ TableChange.ModifyColumnName modifyName = (TableChange.ModifyColumnName) modifyColumn;
+ pendingUpdate.renameColumn(modifyName.getOldColumnName(), modifyName.getNewColumnName());
+ } else if (modifyColumn instanceof TableChange.ModifyColumnPosition) {
+ TableChange.ModifyColumnPosition modifyPosition =
+ (TableChange.ModifyColumnPosition) modifyColumn;
+ applyModifyColumnPosition(pendingUpdate, modifyPosition);
+ } else if (modifyColumn instanceof TableChange.ModifyPhysicalColumnType) {
+ TableChange.ModifyPhysicalColumnType modifyType =
+ (TableChange.ModifyPhysicalColumnType) modifyColumn;
+ Type type = FlinkSchemaUtil.convert(modifyType.getNewType().getLogicalType());
+ String columnName = modifyType.getOldColumn().getName();
+ pendingUpdate.updateColumn(columnName, type.asPrimitiveType());
+ if (modifyType.getNewColumn().getDataType().getLogicalType().isNullable()) {
+ pendingUpdate.makeColumnOptional(columnName);
+ } else {
+ pendingUpdate.requireColumn(columnName);
+ }
+ } else if (modifyColumn instanceof TableChange.ModifyColumnComment) {
+ TableChange.ModifyColumnComment modifyComment =
+ (TableChange.ModifyColumnComment) modifyColumn;
+ pendingUpdate.updateColumnDoc(
+ modifyComment.getOldColumn().getName(), modifyComment.getNewComment());
+ } else {
+ throw new UnsupportedOperationException(
+ "Cannot apply unknown modify-column change: " + modifyColumn);
+ }
+ }
+
+ private static void applyModifyColumnPosition(
+ UpdateSchema pendingUpdate, TableChange.ModifyColumnPosition modifyColumnPosition) {
+ TableChange.ColumnPosition newPosition = modifyColumnPosition.getNewPosition();
+ if (newPosition instanceof TableChange.First) {
+ pendingUpdate.moveFirst(modifyColumnPosition.getOldColumn().getName());
+ } else if (newPosition instanceof TableChange.After) {
+ TableChange.After after = (TableChange.After) newPosition;
+ pendingUpdate.moveAfter(modifyColumnPosition.getOldColumn().getName(), after.column());
+ } else {
+ throw new UnsupportedOperationException(
+ "Cannot apply unknown modify-column-position change: " + modifyColumnPosition);
+ }
+ }
+
+ private static void applyUniqueConstraint(
+ UpdateSchema pendingUpdate, UniqueConstraint constraint) {
+ switch (constraint.getType()) {
+ case PRIMARY_KEY:
+ pendingUpdate.setIdentifierFields(constraint.getColumns());
+ break;
+ case UNIQUE_KEY:
+ throw new UnsupportedOperationException(
+ "Unsupported table change: setting unique key constraints.");
+ default:
+ throw new UnsupportedOperationException(
+ "Cannot apply unknown unique constraint: " + constraint.getType().name());
+ }
+ }
+}
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java
similarity index 91%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java
index 2c5c587f4ebf..f02af894e82b 100644
--- a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java
+++ b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkCompatibilityUtil.java
@@ -20,6 +20,7 @@
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.table.api.TableColumn;
+import org.apache.flink.table.catalog.Column;
import org.apache.flink.table.data.RowData;
import org.apache.flink.table.runtime.typeutils.InternalTypeInfo;
import org.apache.flink.table.types.logical.RowType;
@@ -39,4 +40,8 @@ public static TypeInformation toTypeInfo(RowType rowType) {
public static boolean isPhysicalColumn(TableColumn column) {
return column.isPhysical();
}
+
+ public static boolean isPhysicalColumn(Column column) {
+ return column.isPhysical();
+ }
}
diff --git a/flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/util/FlinkPackage.java b/flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkPackage.java
similarity index 100%
rename from flink/v1.15/flink/src/main/java/org/apache/iceberg/flink/util/FlinkPackage.java
rename to flink/v1.18/flink/src/main/java/org/apache/iceberg/flink/util/FlinkPackage.java
diff --git a/flink/v1.15/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory b/flink/v1.18/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
similarity index 100%
rename from flink/v1.15/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
rename to flink/v1.18/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory
diff --git a/flink/v1.15/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.TableFactory b/flink/v1.18/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.TableFactory
similarity index 100%
rename from flink/v1.15/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.TableFactory
rename to flink/v1.18/flink/src/main/resources/META-INF/services/org.apache.flink.table.factories.TableFactory
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/AvroGenericRecordConverterBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/AvroGenericRecordConverterBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/AvroGenericRecordConverterBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/AvroGenericRecordConverterBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/DataGenerator.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/DataGenerator.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/DataGenerator.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/DataGenerator.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/DataGenerators.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/DataGenerators.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/DataGenerators.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/DataGenerators.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/FlinkCatalogTestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/FlinkCatalogTestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/FlinkCatalogTestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/FlinkCatalogTestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/FlinkTestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/FlinkTestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/FlinkTestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/FlinkTestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogExtension.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogExtension.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogExtension.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogExtension.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogResource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogResource.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogResource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopCatalogResource.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopTableResource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopTableResource.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/HadoopTableResource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/HadoopTableResource.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/MiniClusterResource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/MiniClusterResource.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/MiniClusterResource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/MiniClusterResource.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/MiniFlinkClusterExtension.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/MiniFlinkClusterExtension.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/MiniFlinkClusterExtension.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/MiniFlinkClusterExtension.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/RowDataConverter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/RowDataConverter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/RowDataConverter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/RowDataConverter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/SimpleDataUtil.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/SimpleDataUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/SimpleDataUtil.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/SimpleDataUtil.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestCatalogLoader.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestCatalogLoader.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestCatalogLoader.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestCatalogLoader.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestCatalogTableLoader.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestCatalogTableLoader.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestCatalogTableLoader.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestCatalogTableLoader.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestChangeLogTable.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestChangeLogTable.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestChangeLogTable.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestChangeLogTable.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestDataFileSerialization.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestDataFileSerialization.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestDataFileSerialization.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestDataFileSerialization.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFixtures.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFixtures.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFixtures.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFixtures.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkAnonymousTable.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkAnonymousTable.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkAnonymousTable.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkAnonymousTable.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogDatabase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogDatabase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogDatabase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogDatabase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java
index c3f8bf92e47a..ba08b76dd59d 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogFactory.java
@@ -85,6 +85,7 @@ public void testCreateCatalogCustomWithHiveCatalogTypeSet() {
props.put(CatalogProperties.CATALOG_IMPL, CustomHadoopCatalog.class.getName());
props.put(
FlinkCatalogFactory.ICEBERG_CATALOG_TYPE, FlinkCatalogFactory.ICEBERG_CATALOG_TYPE_HIVE);
+
Assertions.assertThatThrownBy(
() -> FlinkCatalogFactory.createCatalogLoader(catalogName, props, new Configuration()))
.isInstanceOf(IllegalArgumentException.class)
@@ -96,6 +97,7 @@ public void testCreateCatalogCustomWithHiveCatalogTypeSet() {
public void testLoadCatalogUnknown() {
String catalogName = "unknownCatalog";
props.put(FlinkCatalogFactory.ICEBERG_CATALOG_TYPE, "fooType");
+
Assertions.assertThatThrownBy(
() -> FlinkCatalogFactory.createCatalogLoader(catalogName, props, new Configuration()))
.isInstanceOf(UnsupportedOperationException.class)
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java
similarity index 53%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java
index 472cf70b44ba..8f5ddde91851 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTable.java
@@ -28,6 +28,7 @@
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.apache.flink.table.api.DataTypes;
+import org.apache.flink.table.api.TableException;
import org.apache.flink.table.api.TableSchema;
import org.apache.flink.table.api.ValidationException;
import org.apache.flink.table.api.constraints.UniqueConstraint;
@@ -105,9 +106,11 @@ public void testRenameTable() {
new Schema(Types.NestedField.optional(0, "id", Types.LongType.get()));
validationCatalog.createTable(TableIdentifier.of(icebergNamespace, "tl"), tableSchema);
sql("ALTER TABLE tl RENAME TO tl2");
+
Assertions.assertThatThrownBy(() -> getTableEnv().from("tl"))
.isInstanceOf(ValidationException.class)
.hasMessage("Table `tl` was not found.");
+
Schema actualSchema = FlinkSchemaUtil.convert(getTableEnv().from("tl2").getSchema());
Assert.assertEquals(tableSchema.asStruct(), actualSchema.asStruct());
}
@@ -273,6 +276,7 @@ public void testDowngradeTableToFormatV1ThroughTablePropertyFails() throws Excep
Table table = table("tl");
TableOperations ops = ((BaseTable) table).operations();
Assert.assertEquals("should create table using format v2", 2, ops.refresh().formatVersion());
+
Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl SET('format-version'='1')"))
.rootCause()
.isInstanceOf(IllegalArgumentException.class)
@@ -294,7 +298,7 @@ public void testLoadTransformPartitionTable() throws TableNotExistException {
}
@Test
- public void testAlterTable() throws TableNotExistException {
+ public void testAlterTableProperties() throws TableNotExistException {
sql("CREATE TABLE tl(id BIGINT) WITH ('oldK'='oldV')");
Map properties = Maps.newHashMap();
properties.put("oldK", "oldV");
@@ -310,39 +314,297 @@ public void testAlterTable() throws TableNotExistException {
assertThat(table("tl").properties()).containsAllEntriesOf(properties);
// remove property
- CatalogTable catalogTable = catalogTable("tl");
+ sql("ALTER TABLE tl RESET('oldK')");
properties.remove("oldK");
- getTableEnv()
- .getCatalog(getTableEnv().getCurrentCatalog())
- .get()
- .alterTable(new ObjectPath(DATABASE, "tl"), catalogTable.copy(properties), false);
assertThat(table("tl").properties()).containsAllEntriesOf(properties);
}
@Test
- public void testAlterTableWithPrimaryKey() throws TableNotExistException {
- sql("CREATE TABLE tl(id BIGINT, PRIMARY KEY(id) NOT ENFORCED) WITH ('oldK'='oldV')");
- Map properties = Maps.newHashMap();
- properties.put("oldK", "oldV");
+ public void testAlterTableAddColumn() {
+ sql("CREATE TABLE tl(id BIGINT)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(Types.NestedField.optional(1, "id", Types.LongType.get())).asStruct(),
+ schemaBefore.asStruct());
- // new
- sql("ALTER TABLE tl SET('newK'='newV')");
- properties.put("newK", "newV");
- assertThat(table("tl").properties()).containsAllEntriesOf(properties);
+ sql("ALTER TABLE tl ADD (dt STRING)");
+ Schema schemaAfter1 = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaAfter1.asStruct());
- // update old
- sql("ALTER TABLE tl SET('oldK'='oldV2')");
- properties.put("oldK", "oldV2");
- assertThat(table("tl").properties()).containsAllEntriesOf(properties);
+ // Add multiple columns
+ sql("ALTER TABLE tl ADD (col1 STRING, col2 BIGINT)");
+ Schema schemaAfter2 = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()),
+ Types.NestedField.optional(4, "col2", Types.LongType.get()))
+ .asStruct(),
+ schemaAfter2.asStruct());
- // remove property
- CatalogTable catalogTable = catalogTable("tl");
- properties.remove("oldK");
- getTableEnv()
- .getCatalog(getTableEnv().getCurrentCatalog())
- .get()
- .alterTable(new ObjectPath(DATABASE, "tl"), catalogTable.copy(properties), false);
- assertThat(table("tl").properties()).containsAllEntriesOf(properties);
+ // Adding a required field should fail because Iceberg's SchemaUpdate does not allow
+ // incompatible changes.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl ADD (pk STRING NOT NULL)"))
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage("Incompatible change: cannot add required column: pk");
+
+ // Adding an existing field should fail due to Flink's internal validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl ADD (id STRING)"))
+ .isInstanceOf(ValidationException.class)
+ .hasMessageContaining("Try to add a column `id` which already exists in the table.");
+ }
+
+ @Test
+ public void testAlterTableDropColumn() {
+ sql("CREATE TABLE tl(id BIGINT, dt STRING, col1 STRING, col2 BIGINT)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()),
+ Types.NestedField.optional(4, "col2", Types.LongType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ sql("ALTER TABLE tl DROP (dt)");
+ Schema schemaAfter1 = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()),
+ Types.NestedField.optional(4, "col2", Types.LongType.get()))
+ .asStruct(),
+ schemaAfter1.asStruct());
+
+ // Drop multiple columns
+ sql("ALTER TABLE tl DROP (col1, col2)");
+ Schema schemaAfter2 = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(Types.NestedField.optional(1, "id", Types.LongType.get())).asStruct(),
+ schemaAfter2.asStruct());
+
+ // Dropping an non-existing field should fail due to Flink's internal validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl DROP (foo)"))
+ .isInstanceOf(ValidationException.class)
+ .hasMessageContaining("The column `foo` does not exist in the base table.");
+
+ // Dropping an already-deleted field should fail due to Flink's internal validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl DROP (dt)"))
+ .isInstanceOf(ValidationException.class)
+ .hasMessageContaining("The column `dt` does not exist in the base table.");
+ }
+
+ @Test
+ public void testAlterTableModifyColumnName() {
+ sql("CREATE TABLE tl(id BIGINT, dt STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ sql("ALTER TABLE tl RENAME dt TO data");
+ Schema schemaAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "data", Types.StringType.get()))
+ .asStruct(),
+ schemaAfter.asStruct());
+ }
+
+ @Test
+ public void testAlterTableModifyColumnType() {
+ sql("CREATE TABLE tl(id INTEGER, dt STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.IntegerType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ // Promote type from Integer to Long
+ sql("ALTER TABLE tl MODIFY (id BIGINT)");
+ Schema schemaAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaAfter.asStruct());
+
+ // Type change that doesn't follow the type-promotion rule should fail due to Iceberg's
+ // validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl MODIFY (dt INTEGER)"))
+ .isInstanceOf(TableException.class)
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage("Cannot change column type: dt: string -> int");
+ }
+
+ @Test
+ public void testAlterTableModifyColumnNullability() {
+ sql("CREATE TABLE tl(id INTEGER NOT NULL, dt STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.required(1, "id", Types.IntegerType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ // Changing nullability from optional to required should fail
+ // because Iceberg's SchemaUpdate does not allow incompatible changes.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl MODIFY (dt STRING NOT NULL)"))
+ .isInstanceOf(TableException.class)
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage("Cannot change column nullability: dt: optional -> required");
+
+ // Set nullability from required to optional
+ sql("ALTER TABLE tl MODIFY (id INTEGER)");
+ Schema schemaAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.IntegerType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaAfter.asStruct());
+ }
+
+ @Test
+ public void testAlterTableModifyColumnPosition() {
+ sql("CREATE TABLE tl(id BIGINT, dt STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ sql("ALTER TABLE tl MODIFY (dt STRING FIRST)");
+ Schema schemaAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(1, "id", Types.LongType.get()))
+ .asStruct(),
+ schemaAfter.asStruct());
+
+ sql("ALTER TABLE tl MODIFY (dt STRING AFTER id)");
+ Schema schemaAfterAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaAfterAfter.asStruct());
+
+ // Modifying the position of a non-existing column should fail due to Flink's internal
+ // validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl MODIFY (non_existing STRING FIRST)"))
+ .isInstanceOf(ValidationException.class)
+ .hasMessageContaining(
+ "Try to modify a column `non_existing` which does not exist in the table.");
+
+ // Moving a column after a non-existing column should fail due to Flink's internal validation.
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl MODIFY (dt STRING AFTER non_existing)"))
+ .isInstanceOf(ValidationException.class)
+ .hasMessageContaining(
+ "Referenced column `non_existing` by 'AFTER' does not exist in the table.");
+ }
+
+ @Test
+ public void testAlterTableModifyColumnComment() {
+ sql("CREATE TABLE tl(id BIGINT, dt STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+
+ sql("ALTER TABLE tl MODIFY (dt STRING COMMENT 'comment for dt field')");
+ Schema schemaAfter = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.optional(1, "id", Types.LongType.get()),
+ Types.NestedField.optional(2, "dt", Types.StringType.get(), "comment for dt field"))
+ .asStruct(),
+ schemaAfter.asStruct());
+ }
+
+ @Test
+ public void testAlterTableConstraint() {
+ sql("CREATE TABLE tl(id BIGINT NOT NULL, dt STRING NOT NULL, col1 STRING)");
+ Schema schemaBefore = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.required(1, "id", Types.LongType.get()),
+ Types.NestedField.required(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()))
+ .asStruct(),
+ schemaBefore.asStruct());
+ Assert.assertEquals(ImmutableSet.of(), schemaBefore.identifierFieldNames());
+
+ sql("ALTER TABLE tl ADD (PRIMARY KEY (id) NOT ENFORCED)");
+ Schema schemaAfterAdd = table("tl").schema();
+ Assert.assertEquals(ImmutableSet.of("id"), schemaAfterAdd.identifierFieldNames());
+
+ sql("ALTER TABLE tl MODIFY (PRIMARY KEY (dt) NOT ENFORCED)");
+ Schema schemaAfterModify = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.required(1, "id", Types.LongType.get()),
+ Types.NestedField.required(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()))
+ .asStruct(),
+ schemaAfterModify.asStruct());
+ Assert.assertEquals(ImmutableSet.of("dt"), schemaAfterModify.identifierFieldNames());
+
+ // Composite primary key
+ sql("ALTER TABLE tl MODIFY (PRIMARY KEY (id, dt) NOT ENFORCED)");
+ Schema schemaAfterComposite = table("tl").schema();
+ Assert.assertEquals(
+ new Schema(
+ Types.NestedField.required(1, "id", Types.LongType.get()),
+ Types.NestedField.required(2, "dt", Types.StringType.get()),
+ Types.NestedField.optional(3, "col1", Types.StringType.get()))
+ .asStruct(),
+ schemaAfterComposite.asStruct());
+ Assert.assertEquals(ImmutableSet.of("id", "dt"), schemaAfterComposite.identifierFieldNames());
+
+ // Setting an optional field as primary key should fail
+ // because Iceberg's SchemaUpdate does not allow incompatible changes.
+ Assertions.assertThatThrownBy(
+ () -> sql("ALTER TABLE tl MODIFY (PRIMARY KEY (col1) NOT ENFORCED)"))
+ .isInstanceOf(TableException.class)
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage("Cannot add field col1 as an identifier field: not a required field");
+
+ // Setting a composite key containing an optional field should fail
+ // because Iceberg's SchemaUpdate does not allow incompatible changes.
+ Assertions.assertThatThrownBy(
+ () -> sql("ALTER TABLE tl MODIFY (PRIMARY KEY (id, col1) NOT ENFORCED)"))
+ .isInstanceOf(TableException.class)
+ .hasRootCauseInstanceOf(IllegalArgumentException.class)
+ .hasRootCauseMessage("Cannot add field col1 as an identifier field: not a required field");
+
+ // Dropping constraints is not supported yet
+ Assertions.assertThatThrownBy(() -> sql("ALTER TABLE tl DROP PRIMARY KEY"))
+ .isInstanceOf(TableException.class)
+ .hasRootCauseInstanceOf(UnsupportedOperationException.class)
+ .hasRootCauseMessage("Unsupported table change: DropConstraint.");
}
@Test
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java
similarity index 97%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java
index fad65f4c63c8..0008e4320c8a 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkCatalogTablePartitions.java
@@ -92,7 +92,8 @@ public void testListPartitionsWithUnpartitionedTable() {
FlinkCatalog flinkCatalog = (FlinkCatalog) getTableEnv().getCatalog(catalogName).get();
Assertions.assertThatThrownBy(() -> flinkCatalog.listPartitions(objectPath))
.isInstanceOf(TableNotPartitionedException.class)
- .hasMessage("Table " + objectPath + " in catalog " + catalogName + " is not partitioned.");
+ .hasMessageStartingWith("Table db.test_table in catalog")
+ .hasMessageEndingWith("is not partitioned.");
}
@Test
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkConfParser.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkConfParser.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkConfParser.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkConfParser.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkFilters.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkFilters.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkFilters.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkFilters.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkHiveCatalog.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkHiveCatalog.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkHiveCatalog.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkHiveCatalog.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java
index 16b220ba6715..4ac32c08ebef 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkSchemaUtil.java
@@ -407,9 +407,10 @@ public void testConvertFlinkSchemaWithNestedColumnInPrimaryKeys() {
Types.StructType.of(
Types.NestedField.required(2, "inner", Types.IntegerType.get())))),
Sets.newHashSet(2));
+
Assertions.assertThatThrownBy(() -> FlinkSchemaUtil.toSchema(icebergSchema))
.isInstanceOf(ValidationException.class)
.hasMessageStartingWith("Could not create a PRIMARY KEY")
- .hasMessageContaining("Column 'struct.inner' does not exist");
+ .hasMessageContaining("Column 'struct.inner' does not exist.");
}
}
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkTableSink.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkTableSink.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkTableSink.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkTableSink.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkUpsert.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkUpsert.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestFlinkUpsert.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestFlinkUpsert.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java
similarity index 96%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java
index 3e574b841c8d..7d3777935ca8 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestHelpers.java
@@ -416,7 +416,7 @@ private static void assertAvroEquals(
Collection> expectedArrayData = (Collection>) expected;
ArrayData actualArrayData;
try {
- actualArrayData = (ArrayData) actual;
+ actualArrayData = convertToArray(actual);
} catch (ClassCastException e) {
actualArrayData = new GenericArrayData((Object[]) actual);
}
@@ -462,6 +462,29 @@ private static void assertAvroEquals(
}
}
+ private static GenericArrayData convertToArray(Object actual) {
+ Class> arrayClass = actual.getClass();
+ if (Object[].class.equals(arrayClass)) {
+ return new GenericArrayData((Object[]) actual);
+ } else if (int[].class.equals(arrayClass)) {
+ return new GenericArrayData((int[]) actual);
+ } else if (long[].class.equals(arrayClass)) {
+ return new GenericArrayData((long[]) actual);
+ } else if (float[].class.equals(arrayClass)) {
+ return new GenericArrayData((float[]) actual);
+ } else if (double[].class.equals(arrayClass)) {
+ return new GenericArrayData((double[]) actual);
+ } else if (short[].class.equals(arrayClass)) {
+ return new GenericArrayData((short[]) actual);
+ } else if (byte[].class.equals(arrayClass)) {
+ return new GenericArrayData((byte[]) actual);
+ } else if (boolean[].class.equals(arrayClass)) {
+ return new GenericArrayData((boolean[]) actual);
+ } else {
+ throw new IllegalArgumentException("Unsupported type " + arrayClass);
+ }
+ }
+
private static void assertArrayValues(
Type type, LogicalType logicalType, Collection> expectedArray, ArrayData actualArray) {
List> expectedElements = Lists.newArrayList(expectedArray);
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestIcebergConnector.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestIcebergConnector.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestIcebergConnector.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestIcebergConnector.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestManifestFileSerialization.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestManifestFileSerialization.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestManifestFileSerialization.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestManifestFileSerialization.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestRowDataWrapper.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestRowDataWrapper.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestRowDataWrapper.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestRowDataWrapper.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestTableLoader.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestTableLoader.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestTableLoader.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestTableLoader.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestTableSerialization.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestTableSerialization.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/TestTableSerialization.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/TestTableSerialization.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/actions/TestRewriteDataFilesAction.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/actions/TestRewriteDataFilesAction.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/actions/TestRewriteDataFilesAction.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/actions/TestRewriteDataFilesAction.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/RandomRowData.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/RandomRowData.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/RandomRowData.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/RandomRowData.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/RowDataToRowMapper.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/RowDataToRowMapper.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/RowDataToRowMapper.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/RowDataToRowMapper.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkAvroReaderWriter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkAvroReaderWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkAvroReaderWriter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkAvroReaderWriter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkOrcReaderWriter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkOrcReaderWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkOrcReaderWriter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkOrcReaderWriter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetReader.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetWriter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetWriter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestFlinkParquetWriter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestRowDataProjection.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestRowProjection.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestRowProjection.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestRowProjection.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestRowProjection.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestStructRowData.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestStructRowData.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/data/TestStructRowData.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/data/TestStructRowData.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestAvroGenericRecordToRowDataMapper.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestAvroGenericRecordToRowDataMapper.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestAvroGenericRecordToRowDataMapper.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestAvroGenericRecordToRowDataMapper.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionKeySelector.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionKeySelector.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionKeySelector.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionKeySelector.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitioner.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitioner.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitioner.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitioner.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerFlinkIcebergSink.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerUtil.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerUtil.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestBucketPartitionerUtil.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestCachingTableSupplier.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestCachingTableSupplier.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestCachingTableSupplier.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestCachingTableSupplier.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java
index d9d57fb7107e..14f12422da96 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestCompressionSettings.java
@@ -138,7 +138,7 @@ public void testCompressionParquet() throws Exception {
resultProperties.get(TableProperties.PARQUET_COMPRESSION));
Assert.assertEquals(
TableProperties.PARQUET_COMPRESSION_LEVEL_DEFAULT,
- resultProperties.get(TableProperties.PARQUET_COMPRESSION_LEVEL_DEFAULT));
+ resultProperties.get(TableProperties.PARQUET_COMPRESSION_DEFAULT_SINCE_1_4_0));
} else {
Assert.assertEquals(
initProperties.get(TableProperties.PARQUET_COMPRESSION),
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestDeltaTaskWriter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestDeltaTaskWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestDeltaTaskWriter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestDeltaTaskWriter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkAppenderFactory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkAppenderFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkAppenderFactory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkAppenderFactory.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkFileWriterFactory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkFileWriterFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkFileWriterFactory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkFileWriterFactory.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java
index 4bef4d4244e5..11a73d2cc144 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSink.java
@@ -197,6 +197,7 @@ public void testJobHashDistributionMode() {
.updateProperties()
.set(TableProperties.WRITE_DISTRIBUTION_MODE, DistributionMode.HASH.modeName())
.commit();
+
Assertions.assertThatThrownBy(() -> testWriteRow(null, DistributionMode.RANGE))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Flink does not support 'range' write distribution mode now.");
@@ -344,6 +345,7 @@ public void testOverrideWriteConfigWithUnknownDistributionMode() {
.tableLoader(tableLoader)
.writeParallelism(parallelism)
.setAll(newProps);
+
Assertions.assertThatThrownBy(builder::append)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Invalid distribution mode: UNRECOGNIZED");
@@ -363,6 +365,7 @@ public void testOverrideWriteConfigWithUnknownFileFormat() {
.tableLoader(tableLoader)
.writeParallelism(parallelism)
.setAll(newProps);
+
Assertions.assertThatThrownBy(builder::append)
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Invalid file format: UNRECOGNIZED");
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBranch.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBranch.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBranch.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkBranch.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java
index 507df9e35215..0b403756cefe 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Base.java
@@ -244,6 +244,7 @@ protected void testChangeLogOnIdKey(String branch) throws Exception {
.hasMessageStartingWith(
"In 'hash' distribution mode with equality fields set, partition field")
.hasMessageContaining("should be included in equality fields:");
+
} else {
testChangeLogs(
ImmutableList.of("id"),
@@ -287,7 +288,7 @@ protected void testUpsertOnIdKey(String branch) throws Exception {
expectedRecords,
branch))
.isInstanceOf(IllegalStateException.class)
- .hasMessageContaining("should be included in equality fields");
+ .hasMessageContaining("should be included in equality fields:");
}
}
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Branch.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Branch.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Branch.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkIcebergSinkV2Branch.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkManifest.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkManifest.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkManifest.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkManifest.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPartitioningWriters.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPartitioningWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPartitioningWriters.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPartitioningWriters.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPositionDeltaWriters.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPositionDeltaWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPositionDeltaWriters.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkPositionDeltaWriters.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkRollingFileWriters.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkRollingFileWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkRollingFileWriters.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkRollingFileWriters.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkWriterMetrics.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkWriterMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkWriterMetrics.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestFlinkWriterMetrics.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergFilesCommitter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergFilesCommitter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergFilesCommitter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergFilesCommitter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergStreamWriter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergStreamWriter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergStreamWriter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestIcebergStreamWriter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestRowDataPartitionKey.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestRowDataPartitionKey.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestRowDataPartitionKey.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestRowDataPartitionKey.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestTaskWriters.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestTaskWriters.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/TestTaskWriters.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/TestTaskWriters.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatistics.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatistics.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatistics.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatistics.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatisticsTracker.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatisticsTracker.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatisticsTracker.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestAggregatedStatisticsTracker.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java
similarity index 94%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java
index 3be12ea1965b..9ec2606e101d 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinator.java
@@ -77,11 +77,12 @@ public void testThrowExceptionWhenNotStarted() {
assertThatThrownBy(
() ->
dataStatisticsCoordinator.handleEventFromOperator(
+ 0,
0,
DataStatisticsEvent.create(0, new MapDataStatistics(), statisticsSerializer)))
.isInstanceOf(IllegalStateException.class)
.hasMessage(failureMessage);
- assertThatThrownBy(() -> dataStatisticsCoordinator.subtaskFailed(0, null))
+ assertThatThrownBy(() -> dataStatisticsCoordinator.executionAttemptFailed(0, 0, null))
.isInstanceOf(IllegalStateException.class)
.hasMessage(failureMessage);
assertThatThrownBy(() -> dataStatisticsCoordinator.checkpointCoordinator(0, null))
@@ -121,8 +122,8 @@ public void testDataStatisticsEventHandling() throws Exception {
checkpoint1Subtask1DataStatisticEvent =
DataStatisticsEvent.create(1, checkpoint1Subtask1DataStatistic, statisticsSerializer);
// Handle events from operators for checkpoint 1
- dataStatisticsCoordinator.handleEventFromOperator(0, checkpoint1Subtask0DataStatisticEvent);
- dataStatisticsCoordinator.handleEventFromOperator(1, checkpoint1Subtask1DataStatisticEvent);
+ dataStatisticsCoordinator.handleEventFromOperator(0, 0, checkpoint1Subtask0DataStatisticEvent);
+ dataStatisticsCoordinator.handleEventFromOperator(1, 0, checkpoint1Subtask1DataStatisticEvent);
waitForCoordinatorToProcessActions(dataStatisticsCoordinator);
// Verify global data statistics is the aggregation of all subtasks data statistics
@@ -147,7 +148,8 @@ static void setAllTasksReady(
DataStatisticsCoordinator> dataStatisticsCoordinator,
EventReceivingTasks receivingTasks) {
for (int i = 0; i < subtasks; i++) {
- dataStatisticsCoordinator.subtaskReady(i, receivingTasks.createGatewayForSubtask(i));
+ dataStatisticsCoordinator.executionAttemptReady(
+ i, 0, receivingTasks.createGatewayForSubtask(i, 0));
}
}
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java
similarity index 97%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java
index 072332383ada..cb9d3f48ffeb 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsCoordinatorProvider.java
@@ -95,7 +95,7 @@ public void testCheckpointAndReset() throws Exception {
DataStatisticsEvent.create(1, checkpoint1Subtask0DataStatistic, statisticsSerializer);
// Handle events from operators for checkpoint 1
- coordinator.handleEventFromOperator(0, checkpoint1Subtask0DataStatisticEvent);
+ coordinator.handleEventFromOperator(0, 0, checkpoint1Subtask0DataStatisticEvent);
TestDataStatisticsCoordinator.waitForCoordinatorToProcessActions(dataStatisticsCoordinator);
// Verify checkpoint 1 global data statistics
MapDataStatistics checkpoint1GlobalDataStatistics =
@@ -112,7 +112,7 @@ public void testCheckpointAndReset() throws Exception {
checkpoint2Subtask0DataStatisticEvent =
DataStatisticsEvent.create(2, checkpoint2Subtask0DataStatistic, statisticsSerializer);
// Handle events from operators for checkpoint 2
- coordinator.handleEventFromOperator(0, checkpoint2Subtask0DataStatisticEvent);
+ coordinator.handleEventFromOperator(0, 0, checkpoint2Subtask0DataStatisticEvent);
TestDataStatisticsCoordinator.waitForCoordinatorToProcessActions(dataStatisticsCoordinator);
// Verify checkpoint 2 global data statistics
MapDataStatistics checkpoint2GlobalDataStatistics =
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsOperator.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsOperator.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsOperator.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/sink/shuffle/TestDataStatisticsOperator.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTableFactory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTableFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTableFactory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTableFactory.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTestSource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTestSource.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTestSource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/BoundedTestSource.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/ChangeLogTableTestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/ChangeLogTableTestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/ChangeLogTableTestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/ChangeLogTableTestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/SplitHelpers.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/SplitHelpers.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/SplitHelpers.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/SplitHelpers.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/SqlHelpers.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/SqlHelpers.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/SqlHelpers.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/SqlHelpers.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestBoundedTableFactory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestBoundedTableFactory.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestBoundedTableFactory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestBoundedTableFactory.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormat.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormat.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormat.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormat.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormatReaderDeletes.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormatReaderDeletes.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormatReaderDeletes.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkInputFormatReaderDeletes.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMergingMetrics.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMergingMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMergingMetrics.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMergingMetrics.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMetaDataTable.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMetaDataTable.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMetaDataTable.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkMetaDataTable.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkReaderDeletesBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkReaderDeletesBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkReaderDeletesBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkReaderDeletesBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java
index b4301b2fc4d7..b537efa7272b 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScan.java
@@ -354,6 +354,7 @@ public void testIncrementalReadViaTag() throws Exception {
.buildOrThrow()),
expected,
TestFixtures.SCHEMA);
+
Assertions.assertThatThrownBy(
() ->
runWithOptions(
@@ -364,6 +365,7 @@ public void testIncrementalReadViaTag() throws Exception {
.buildOrThrow()))
.isInstanceOf(Exception.class)
.hasMessage("START_SNAPSHOT_ID and START_TAG cannot both be set.");
+
Assertions.assertThatThrownBy(
() ->
runWithOptions(
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScanSql.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScanSql.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScanSql.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkScanSql.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSource.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSource.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceConfig.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceConfig.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceConfig.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceConfig.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceSql.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceSql.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceSql.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkSourceSql.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java
similarity index 90%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java
index c3e23d34faf5..ff14bc406276 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestFlinkTableSource.java
@@ -96,15 +96,15 @@ public void before() {
public void clean() {
sql("DROP TABLE IF EXISTS %s.%s", DATABASE_NAME, TABLE_NAME);
sql("DROP DATABASE IF EXISTS %s", DATABASE_NAME);
- sql("DROP CATALOG IF EXISTS %s", CATALOG_NAME);
+ dropCatalog(CATALOG_NAME, true);
}
@Test
public void testLimitPushDown() {
+
Assertions.assertThatThrownBy(() -> sql("SELECT * FROM %s LIMIT -1", TABLE_NAME))
- .as("Invalid limit number: -1 ")
.isInstanceOf(SqlParserException.class)
- .hasMessageContaining("SQL parse failed. Encountered \"-\"");
+ .hasMessageStartingWith("SQL parse failed.");
Assert.assertEquals(
"Should have 0 record", 0, sql("SELECT * FROM %s LIMIT 0", TABLE_NAME).size());
@@ -420,8 +420,12 @@ public void testFilterPushDownInNull() {
Assert.assertEquals("Should have 1 record", 1, result.size());
Assert.assertEquals(
"Should produce the expected record", Row.of(1, "iceberg", 10.0), result.get(0));
+
+ // In SQL, null check can only be done as IS NULL or IS NOT NULL, so it's correct to ignore it
+ // and push the rest down.
+ String expectedScan = "ref(name=\"data\") == \"iceberg\"";
Assert.assertEquals(
- "Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
+ "Should contain the push down filter", expectedScan, lastScanEvent.filter().toString());
}
@Test
@@ -443,8 +447,9 @@ public void testFilterPushDownNotInNull() {
String sqlNotInNull = String.format("SELECT * FROM %s WHERE id NOT IN (1,2,NULL) ", TABLE_NAME);
List resultGT = sql(sqlNotInNull);
Assert.assertEquals("Should have 0 record", 0, resultGT.size());
- Assert.assertEquals(
- "Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
+ Assert.assertNull(
+ "As the predicate pushdown filter out all rows, Flink did not create scan plan, so it doesn't publish any ScanEvent.",
+ lastScanEvent);
}
@Test
@@ -540,6 +545,17 @@ public void testFilterPushDownLike() {
Assert.assertEquals("Should create only one scan", 1, scanEventCount);
Assert.assertEquals(
"Should contain the push down filter", expectedFilter, lastScanEvent.filter().toString());
+
+ // %% won't match the row with null value
+ sqlLike = "SELECT * FROM " + TABLE_NAME + " WHERE data LIKE '%%' ";
+ resultLike = sql(sqlLike);
+ Assert.assertEquals("Should have 2 records", 2, resultLike.size());
+ List expectedRecords =
+ Lists.newArrayList(Row.of(1, "iceberg", 10.0), Row.of(2, "b", 20.0));
+ assertSameElements(expectedRecords, resultLike);
+ String expectedScan = "not_null(ref(name=\"data\"))";
+ Assert.assertEquals(
+ "Should contain the push down filter", expectedScan, lastScanEvent.filter().toString());
}
@Test
@@ -547,7 +563,7 @@ public void testFilterNotPushDownLike() {
Row expectRecord = Row.of(1, "iceberg", 10.0);
String sqlNoPushDown = "SELECT * FROM " + TABLE_NAME + " WHERE data LIKE '%%i' ";
List resultLike = sql(sqlNoPushDown);
- Assert.assertEquals("Should have 1 record", 0, resultLike.size());
+ Assert.assertEquals("Should have 0 record", 0, resultLike.size());
Assert.assertEquals(
"Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
@@ -565,15 +581,6 @@ public void testFilterNotPushDownLike() {
Assert.assertEquals(
"Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
- sqlNoPushDown = "SELECT * FROM " + TABLE_NAME + " WHERE data LIKE '%%' ";
- resultLike = sql(sqlNoPushDown);
- Assert.assertEquals("Should have 3 records", 3, resultLike.size());
- List expectedRecords =
- Lists.newArrayList(Row.of(1, "iceberg", 10.0), Row.of(2, "b", 20.0), Row.of(3, null, 30.0));
- assertSameElements(expectedRecords, resultLike);
- Assert.assertEquals(
- "Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
-
sqlNoPushDown = "SELECT * FROM " + TABLE_NAME + " WHERE data LIKE 'iceber_' ";
resultLike = sql(sqlNoPushDown);
Assert.assertEquals("Should have 1 record", 1, resultLike.size());
@@ -600,47 +607,8 @@ public void testFilterPushDown2Literal() {
"Should not push down a filter", Expressions.alwaysTrue(), lastScanEvent.filter());
}
- /**
- * NaN is not supported by flink now, so we add the test case to assert the parse error, when we
- * upgrade the flink that supports NaN, we will delele the method, and add some test case to test
- * NaN.
- */
- @Test
- public void testSqlParseError() {
- String sqlParseErrorEqual =
- String.format("SELECT * FROM %s WHERE d = CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorEqual))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
-
- String sqlParseErrorNotEqual =
- String.format("SELECT * FROM %s WHERE d <> CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorNotEqual))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
-
- String sqlParseErrorGT =
- String.format("SELECT * FROM %s WHERE d > CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorGT))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
-
- String sqlParseErrorLT =
- String.format("SELECT * FROM %s WHERE d < CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorLT))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
-
- String sqlParseErrorGTE =
- String.format("SELECT * FROM %s WHERE d >= CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorGTE))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
-
- String sqlParseErrorLTE =
- String.format("SELECT * FROM %s WHERE d <= CAST('NaN' AS DOUBLE) ", TABLE_NAME);
- Assertions.assertThatThrownBy(() -> sql(sqlParseErrorLTE))
- .isInstanceOf(NumberFormatException.class)
- .hasMessageContaining("Infinite or NaN");
+ @Test
+ public void testSqlParseNaN() {
+ // todo add some test case to test NaN
}
}
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBounded.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBounded.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBounded.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBounded.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedGenericRecord.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedGenericRecord.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedGenericRecord.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedGenericRecord.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedSql.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedSql.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedSql.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceBoundedSql.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceContinuous.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceContinuous.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceContinuous.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceContinuous.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailover.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailover.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailover.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailover.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailoverWithWatermarkExtractor.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailoverWithWatermarkExtractor.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailoverWithWatermarkExtractor.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceFailoverWithWatermarkExtractor.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceReaderDeletes.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceReaderDeletes.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceReaderDeletes.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceReaderDeletes.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceSql.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceSql.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceSql.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceSql.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
similarity index 91%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
index ac4d07fa52d3..aa4b9cd79e55 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestIcebergSourceWithWatermarkExtractor.java
@@ -30,7 +30,6 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
-import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
@@ -40,7 +39,6 @@
import org.apache.flink.api.common.eventtime.SerializableTimestampAssigner;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.typeinfo.TypeInformation;
-import org.apache.flink.api.common.typeutils.TypeSerializer;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.CoreOptions;
import org.apache.flink.core.execution.JobClient;
@@ -52,10 +50,6 @@
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.AllWindowFunction;
-import org.apache.flink.streaming.api.operators.collect.CollectResultIterator;
-import org.apache.flink.streaming.api.operators.collect.CollectSinkOperator;
-import org.apache.flink.streaming.api.operators.collect.CollectSinkOperatorFactory;
-import org.apache.flink.streaming.api.operators.collect.CollectStreamSink;
import org.apache.flink.streaming.api.windowing.assigners.TumblingEventTimeWindows;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
@@ -308,14 +302,8 @@ public void testThrottling() throws Exception {
SOURCE_NAME,
TypeInformation.of(RowData.class));
- // Flink 1.15 only change - start
- CollectResultIterator resultStream = addCollectSink(stream);
-
- // Start the job
- JobClient jobClient = env.executeAsync("Iceberg Source Throttling Test");
- resultStream.setJobClient(jobClient);
- try (CollectResultIterator resultIterator = resultStream) {
- // Flink 1.15 only change - end
+ try (CloseableIterator resultIterator = stream.collectAsync()) {
+ JobClient jobClient = env.executeAsync("Iceberg Source Throttling Test");
// Check that the read the non-blocked data
// The first RECORD_NUM_FOR_2_SPLITS should be read
@@ -464,22 +452,4 @@ public long extractTimestamp(RowData element, long recordTimestamp) {
return element.getTimestamp(0, 0).getMillisecond();
}
}
-
- // Flink 1.15 only method
- private CollectResultIterator addCollectSink(DataStream stream) {
- TypeSerializer serializer =
- stream.getType().createSerializer(stream.getExecutionConfig());
- String accumulatorName = "dataStreamCollect_" + UUID.randomUUID();
- CollectSinkOperatorFactory factory =
- new CollectSinkOperatorFactory<>(serializer, accumulatorName);
- CollectSinkOperator operator = (CollectSinkOperator) factory.getOperator();
- CollectStreamSink sink = new CollectStreamSink<>(stream, factory);
- sink.name("Data stream collect sink");
- stream.getExecutionEnvironment().addOperator(sink.getTransformation());
- return new CollectResultIterator<>(
- operator.getOperatorIdFuture(),
- serializer,
- accumulatorName,
- stream.getExecutionEnvironment().getCheckpointConfig());
- }
}
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestMetadataTableReadableMetrics.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestMetadataTableReadableMetrics.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestMetadataTableReadableMetrics.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestMetadataTableReadableMetrics.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestProjectMetaColumn.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestProjectMetaColumn.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestProjectMetaColumn.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestProjectMetaColumn.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestRowDataToAvroGenericRecordConverter.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestRowDataToAvroGenericRecordConverter.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestRowDataToAvroGenericRecordConverter.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestRowDataToAvroGenericRecordConverter.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestSourceUtil.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestSourceUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestSourceUtil.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestSourceUtil.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestSqlBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestSqlBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestSqlBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestSqlBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java
index eaba615ce910..633e11718b9b 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamScanSql.java
@@ -219,6 +219,7 @@ public void testConsumeFilesWithBranch() throws Exception {
Row row1 = Row.of(1, "aaa", "2021-01-01");
Row row2 = Row.of(2, "bbb", "2021-01-01");
insertRows(table, row1, row2);
+
Assertions.assertThatThrownBy(
() ->
exec(
@@ -304,6 +305,7 @@ public void testConsumeFromStartTag() throws Exception {
assertRows(ImmutableList.of(row7), iterator);
}
result.getJobClient().ifPresent(JobClient::cancel);
+
Assertions.assertThatThrownBy(
() ->
exec(
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java
index 8af1dd883f4c..494c633088d9 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingMonitorFunction.java
@@ -250,6 +250,7 @@ public void testInvalidMaxPlanningSnapshotCount() {
.monitorInterval(Duration.ofMillis(100))
.maxPlanningSnapshotCount(0)
.build();
+
Assertions.assertThatThrownBy(() -> createFunction(scanContext1))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("The max-planning-snapshot-count must be greater than zero");
@@ -259,6 +260,7 @@ public void testInvalidMaxPlanningSnapshotCount() {
.monitorInterval(Duration.ofMillis(100))
.maxPlanningSnapshotCount(-10)
.build();
+
Assertions.assertThatThrownBy(() -> createFunction(scanContext2))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("The max-planning-snapshot-count must be greater than zero");
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingReaderOperator.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingReaderOperator.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingReaderOperator.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/TestStreamingReaderOperator.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/SplitAssignerTestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/SplitAssignerTestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/SplitAssignerTestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/SplitAssignerTestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestDefaultSplitAssigner.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestDefaultSplitAssigner.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestDefaultSplitAssigner.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestDefaultSplitAssigner.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestFileSequenceNumberBasedSplitAssigner.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestFileSequenceNumberBasedSplitAssigner.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestFileSequenceNumberBasedSplitAssigner.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestFileSequenceNumberBasedSplitAssigner.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestWatermarkBasedSplitAssigner.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestWatermarkBasedSplitAssigner.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestWatermarkBasedSplitAssigner.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/assigner/TestWatermarkBasedSplitAssigner.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/ManualContinuousSplitPlanner.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/ManualContinuousSplitPlanner.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/ManualContinuousSplitPlanner.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/ManualContinuousSplitPlanner.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java
similarity index 97%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java
index 5b0ed39745c5..349eb11cf549 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousIcebergEnumerator.java
@@ -18,6 +18,7 @@
*/
package org.apache.iceberg.flink.source.enumerator;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -172,7 +173,7 @@ public void testThrottlingDiscovery() throws Exception {
enumerator.handleSourceEvent(2, new SplitRequestEvent());
// add splits[0] to the planner for next discovery
- splitPlanner.addSplits(Collections.singletonList(splits.get(0)));
+ splitPlanner.addSplits(Arrays.asList(splits.get(0)));
enumeratorContext.triggerAllActions();
// because discovered split was assigned to reader, pending splits should be empty
@@ -184,7 +185,7 @@ public void testThrottlingDiscovery() throws Exception {
// add the remaining 9 splits (one for every snapshot)
// run discovery cycles while reader-2 still processing the splits[0]
for (int i = 1; i < 10; ++i) {
- splitPlanner.addSplits(Collections.singletonList(splits.get(i)));
+ splitPlanner.addSplits(Arrays.asList(splits.get(i)));
enumeratorContext.triggerAllActions();
}
@@ -195,8 +196,7 @@ public void testThrottlingDiscovery() throws Exception {
splits.subList(0, 1), enumeratorContext.getSplitAssignments().get(2).getAssignedSplits());
// now reader-2 finished splits[0]
- enumerator.handleSourceEvent(
- 2, new SplitRequestEvent(Collections.singletonList(splits.get(0).splitId())));
+ enumerator.handleSourceEvent(2, new SplitRequestEvent(Arrays.asList(splits.get(0).splitId())));
enumeratorContext.triggerAllActions();
// still have 3 pending splits. After assigned splits[1] to reader-2, one more split was
// discovered and added.
@@ -217,8 +217,7 @@ public void testThrottlingDiscovery() throws Exception {
splits.subList(0, 2), enumeratorContext.getSplitAssignments().get(2).getAssignedSplits());
// now reader-2 finished splits[1]
- enumerator.handleSourceEvent(
- 2, new SplitRequestEvent(Collections.singletonList(splits.get(1).splitId())));
+ enumerator.handleSourceEvent(2, new SplitRequestEvent(Arrays.asList(splits.get(1).splitId())));
enumeratorContext.triggerAllActions();
// still have 3 pending splits. After assigned new splits[2] to reader-2, one more split was
// discovered and added.
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java
similarity index 99%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java
index bb747caae589..1bb2b1c6bf85 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImpl.java
@@ -337,6 +337,7 @@ public void testIncrementalFromSnapshotIdWithEmptyTable() {
ContinuousSplitPlannerImpl splitPlanner =
new ContinuousSplitPlannerImpl(
tableResource.tableLoader().clone(), scanContextWithInvalidSnapshotId, null);
+
Assertions.assertThatThrownBy(() -> splitPlanner.planSplits(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Start snapshot id not found in history: 1");
@@ -362,6 +363,7 @@ public void testIncrementalFromSnapshotIdWithInvalidIds() throws Exception {
ContinuousSplitPlannerImpl splitPlanner =
new ContinuousSplitPlannerImpl(
tableResource.tableLoader().clone(), scanContextWithInvalidSnapshotId, null);
+
Assertions.assertThatThrownBy(() -> splitPlanner.planSplits(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Start snapshot id not found in history: " + invalidSnapshotId);
@@ -423,6 +425,7 @@ public void testIncrementalFromSnapshotTimestampWithEmptyTable() {
ContinuousSplitPlannerImpl splitPlanner =
new ContinuousSplitPlannerImpl(
tableResource.tableLoader().clone(), scanContextWithInvalidSnapshotId, null);
+
Assertions.assertThatThrownBy(() -> splitPlanner.planSplits(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Cannot find a snapshot after: 1");
@@ -443,9 +446,10 @@ public void testIncrementalFromSnapshotTimestampWithInvalidIds() throws Exceptio
ContinuousSplitPlannerImpl splitPlanner =
new ContinuousSplitPlannerImpl(
tableResource.tableLoader().clone(), scanContextWithInvalidSnapshotId, null);
+
Assertions.assertThatThrownBy(() -> splitPlanner.planSplits(null))
.isInstanceOf(IllegalArgumentException.class)
- .hasMessageStartingWith("Cannot find a snapshot after: ");
+ .hasMessageStartingWith("Cannot find a snapshot after:");
}
@Test
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImplStartStrategy.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImplStartStrategy.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImplStartStrategy.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestContinuousSplitPlannerImplStartStrategy.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestEnumerationHistory.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestEnumerationHistory.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestEnumerationHistory.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestEnumerationHistory.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestIcebergEnumeratorStateSerializer.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestIcebergEnumeratorStateSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestIcebergEnumeratorStateSerializer.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/enumerator/TestIcebergEnumeratorStateSerializer.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderFunctionTestBase.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderFunctionTestBase.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderFunctionTestBase.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderFunctionTestBase.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderUtil.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderUtil.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderUtil.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/ReaderUtil.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayBatchRecords.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayBatchRecords.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayBatchRecords.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayBatchRecords.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayPoolDataIteratorBatcherRowData.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayPoolDataIteratorBatcherRowData.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayPoolDataIteratorBatcherRowData.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestArrayPoolDataIteratorBatcherRowData.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestColumnStatsWatermarkExtractor.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestColumnStatsWatermarkExtractor.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestColumnStatsWatermarkExtractor.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestColumnStatsWatermarkExtractor.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestIcebergSourceReader.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestRowDataReaderFunction.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestRowDataReaderFunction.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestRowDataReaderFunction.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestRowDataReaderFunction.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestingMetricGroup.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestingMetricGroup.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestingMetricGroup.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/reader/TestingMetricGroup.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/split/TestIcebergSourceSplitSerializer.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/split/TestIcebergSourceSplitSerializer.java
similarity index 100%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/source/split/TestIcebergSourceSplitSerializer.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/source/split/TestIcebergSourceSplitSerializer.java
diff --git a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java
similarity index 94%
rename from flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java
rename to flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java
index caacbd4b5a30..a805d160d809 100644
--- a/flink/v1.15/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java
+++ b/flink/v1.18/flink/src/test/java/org/apache/iceberg/flink/util/TestFlinkPackage.java
@@ -26,6 +26,6 @@ public class TestFlinkPackage {
/** This unit test would need to be adjusted as new Flink version is supported. */
@Test
public void testVersion() {
- Assert.assertEquals("1.15.0", FlinkPackage.version());
+ Assert.assertEquals("1.18.0", FlinkPackage.version());
}
}
diff --git a/flink/v1.15/flink/src/test/resources/META-INF/services/org.apache.flink.table.factories.Factory b/flink/v1.18/flink/src/test/resources/META-INF/services/org.apache.flink.table.factories.Factory
similarity index 100%
rename from flink/v1.15/flink/src/test/resources/META-INF/services/org.apache.flink.table.factories.Factory
rename to flink/v1.18/flink/src/test/resources/META-INF/services/org.apache.flink.table.factories.Factory
diff --git a/gradle.properties b/gradle.properties
index 1bce26270354..84644da7c4ba 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -16,8 +16,8 @@
jmhOutputPath=build/reports/jmh/human-readable-output.txt
jmhJsonOutputPath=build/reports/jmh/results.json
jmhIncludeRegex=.*
-systemProp.defaultFlinkVersions=1.17
-systemProp.knownFlinkVersions=1.15,1.16,1.17
+systemProp.defaultFlinkVersions=1.18
+systemProp.knownFlinkVersions=1.16,1.17,1.18
systemProp.defaultHiveVersions=2
systemProp.knownHiveVersions=2,3
systemProp.defaultSparkVersions=3.5
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index f5c391fa95b5..29d5610f3c32 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -36,9 +36,9 @@ delta-core = "2.2.0"
esotericsoftware-kryo = "4.0.2"
errorprone-annotations = "2.23.0"
findbugs-jsr305 = "3.0.2"
-flink115 = { strictly = "[1.15, 1.16[", prefer = "1.15.0"} # see rich version usage explanation above
flink116 = { strictly = "[1.16, 1.17[", prefer = "1.16.2"}
flink117 = { strictly = "[1.17, 1.18[", prefer = "1.17.1"}
+flink118 = { strictly = "[1.18, 1.19[", prefer = "1.18.0"}
google-libraries-bom = "26.27.0"
guava = "32.1.3-jre"
hadoop2 = "2.7.3"
@@ -104,12 +104,6 @@ calcite-druid = { module = "org.apache.calcite:calcite-druid", version.ref = "ca
delta-standalone = { module = "io.delta:delta-standalone_2.12", version.ref = "delta-standalone" }
errorprone-annotations = { module = "com.google.errorprone:error_prone_annotations", version.ref = "errorprone-annotations" }
findbugs-jsr305 = { module = "com.google.code.findbugs:jsr305", version.ref = "findbugs-jsr305" }
-flink115-avro = { module = "org.apache.flink:flink-avro", version.ref = "flink115" }
-flink115-connector-base = { module = "org.apache.flink:flink-connector-base", version.ref = "flink115" }
-flink115-connector-files = { module = "org.apache.flink:flink-connector-files", version.ref = "flink115" }
-flink115-metrics-dropwizard = { module = "org.apache.flink:flink-metrics-dropwizard", version.ref = "flink115" }
-flink115-streaming-java = { module = "org.apache.flink:flink-streaming-java", version.ref = "flink115" }
-flink115-table-api-java-bridge = { module = "org.apache.flink:flink-table-api-java-bridge", version.ref = "flink115" }
flink116-avro = { module = "org.apache.flink:flink-avro", version.ref = "flink116" }
flink116-connector-base = { module = "org.apache.flink:flink-connector-base", version.ref = "flink116" }
flink116-connector-files = { module = "org.apache.flink:flink-connector-files", version.ref = "flink116" }
@@ -122,6 +116,12 @@ flink117-connector-files = { module = "org.apache.flink:flink-connector-files",
flink117-metrics-dropwizard = { module = "org.apache.flink:flink-metrics-dropwizard", version.ref = "flink117" }
flink117-streaming-java = { module = "org.apache.flink:flink-streaming-java", version.ref = "flink117" }
flink117-table-api-java-bridge = { module = "org.apache.flink:flink-table-api-java-bridge", version.ref = "flink117" }
+flink118-avro = { module = "org.apache.flink:flink-avro", version.ref = "flink118" }
+flink118-connector-base = { module = "org.apache.flink:flink-connector-base", version.ref = "flink118" }
+flink118-connector-files = { module = "org.apache.flink:flink-connector-files", version.ref = "flink118" }
+flink118-metrics-dropwizard = { module = "org.apache.flink:flink-metrics-dropwizard", version.ref = "flink118" }
+flink118-streaming-java = { module = "org.apache.flink:flink-streaming-java", version.ref = "flink118" }
+flink118-table-api-java-bridge = { module = "org.apache.flink:flink-table-api-java-bridge", version.ref = "flink118" }
google-libraries-bom = { module = "com.google.cloud:libraries-bom", version.ref = "google-libraries-bom" }
guava-guava = { module = "com.google.guava:guava", version.ref = "guava" }
hadoop2-client = { module = "org.apache.hadoop:hadoop-client", version.ref = "hadoop2" }
@@ -171,11 +171,6 @@ assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj-cor
awaitility = { module = "org.awaitility:awaitility", version.ref = "awaitility" }
delta-core = { module = "io.delta:delta-core_2.12", version.ref = "delta-core" }
esotericsoftware-kryo = { module = "com.esotericsoftware:kryo", version.ref = "esotericsoftware-kryo" }
-flink115-connector-test-utils = { module = "org.apache.flink:flink-connector-test-utils", version.ref = "flink115" }
-flink115-core = { module = "org.apache.flink:flink-core", version.ref = "flink115" }
-flink115-runtime = { module = "org.apache.flink:flink-runtime", version.ref = "flink115" }
-flink115-test-utils = { module = "org.apache.flink:flink-test-utils", version.ref = "flink115" }
-flink115-test-utilsjunit = { module = "org.apache.flink:flink-test-utils-junit", version.ref = "flink115" }
flink116-connector-test-utils = { module = "org.apache.flink:flink-connector-test-utils", version.ref = "flink116" }
flink116-core = { module = "org.apache.flink:flink-core", version.ref = "flink116" }
flink116-runtime = { module = "org.apache.flink:flink-runtime", version.ref = "flink116" }
@@ -186,6 +181,11 @@ flink117-core = { module = "org.apache.flink:flink-core", version.ref = "flink11
flink117-runtime = { module = "org.apache.flink:flink-runtime", version.ref = "flink117" }
flink117-test-utils = { module = "org.apache.flink:flink-test-utils", version.ref = "flink117" }
flink117-test-utilsjunit = { module = "org.apache.flink:flink-test-utils-junit", version.ref = "flink117" }
+flink118-connector-test-utils = { module = "org.apache.flink:flink-connector-test-utils", version.ref = "flink118" }
+flink118-core = { module = "org.apache.flink:flink-core", version.ref = "flink118" }
+flink118-runtime = { module = "org.apache.flink:flink-runtime", version.ref = "flink118" }
+flink118-test-utils = { module = "org.apache.flink:flink-test-utils", version.ref = "flink118" }
+flink118-test-utilsjunit = { module = "org.apache.flink:flink-test-utils-junit", version.ref = "flink118" }
guava-testlib = { module = "com.google.guava:guava-testlib", version.ref = "guava" }
jackson-annotations = { module = "com.fasterxml.jackson.core:jackson-annotations", version.ref = "jackson-annotations" }
jackson-dataformat-xml = { module = "com.fasterxml.jackson.dataformat:jackson-dataformat-xml", version.ref = "jackson-dataformat-xml" }
diff --git a/settings.gradle b/settings.gradle
index 9ab130413077..a487fe1ffdac 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -106,15 +106,6 @@ if (!flinkVersions.isEmpty()) {
project(':flink').name = 'iceberg-flink'
}
-if (flinkVersions.contains("1.15")) {
- include ":iceberg-flink:flink-1.15"
- include ":iceberg-flink:flink-runtime-1.15"
- project(":iceberg-flink:flink-1.15").projectDir = file('flink/v1.15/flink')
- project(":iceberg-flink:flink-1.15").name = "iceberg-flink-1.15"
- project(":iceberg-flink:flink-runtime-1.15").projectDir = file('flink/v1.15/flink-runtime')
- project(":iceberg-flink:flink-runtime-1.15").name = "iceberg-flink-runtime-1.15"
-}
-
if (flinkVersions.contains("1.16")) {
include ":iceberg-flink:flink-1.16"
include ":iceberg-flink:flink-runtime-1.16"
@@ -133,6 +124,15 @@ if (flinkVersions.contains("1.17")) {
project(":iceberg-flink:flink-runtime-1.17").name = "iceberg-flink-runtime-1.17"
}
+if (flinkVersions.contains("1.18")) {
+ include ":iceberg-flink:flink-1.18"
+ include ":iceberg-flink:flink-runtime-1.18"
+ project(":iceberg-flink:flink-1.18").projectDir = file('flink/v1.18/flink')
+ project(":iceberg-flink:flink-1.18").name = "iceberg-flink-1.18"
+ project(":iceberg-flink:flink-runtime-1.18").projectDir = file('flink/v1.18/flink-runtime')
+ project(":iceberg-flink:flink-runtime-1.18").name = "iceberg-flink-runtime-1.18"
+}
+
if (sparkVersions.contains("3.2")) {
include ":iceberg-spark:spark-3.2_${scalaVersion}"
include ":iceberg-spark:spark-extensions-3.2_${scalaVersion}"