diff --git a/.bin/agent-ice b/.bin/agent-ice
new file mode 100755
index 00000000..e8d44971
--- /dev/null
+++ b/.bin/agent-ice
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+set -euo pipefail
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
+PROJECT_ROOT=$(cd -- "$SCRIPT_DIR/.." && pwd)
+
+shopt -s nullglob
+jars=("$PROJECT_ROOT"/ice/target/ice-*-shaded.jar)
+shopt -u nullglob
+if (( ${#jars[@]} == 0 )); then
+ echo "agent-ice: no ice-*-shaded.jar in $PROJECT_ROOT/ice/target/." >&2
+ exit 1
+fi
+jar=$(ls -t "${jars[@]}" | head -n1)
+
+exec "${JAVA_HOME:?JAVA_HOME not set — run inside direnv shell}/bin/java" \
+-agentlib:native-image-agent=config-merge-dir=$PROJECT_ROOT/ice/src/main/resources/META-INF/native-image/com.altinity/ice,experimental-class-loader-support \
+-jar "$jar" "$@"
diff --git a/.github/workflows/verify.yaml b/.github/workflows/verify.yaml
index 849c3519..9eb42f85 100644
--- a/.github/workflows/verify.yaml
+++ b/.github/workflows/verify.yaml
@@ -17,7 +17,6 @@ jobs:
- run: ./mvnw clean verify
- name: Install
run: ./mvnw install
- # TODO: check native-image can build ice
- name: Run Scenario-Based Integration Tests
run: ../mvnw test -Dtest=ScenarioBasedIT
working-directory: ice-rest-catalog
@@ -58,3 +57,33 @@ jobs:
-Dit.test=DockerScenarioBasedIT,DockerLocalFileIOClickHouseIT
-Ddocker.image=altinity/ice-rest-catalog:debug-with-ice-latest-master-amd64
-Dclickhouse.image=altinity/clickhouse-server:25.8.16.20002.altinityantalya
+ native-build:
+ name: Build and test native image (${{ matrix.arch }})
+ runs-on: ${{ matrix.runner }}
+ strategy:
+ matrix:
+ include:
+ - arch: amd64
+ runner: ubuntu-24.04
+ artifact: ice-native-amd64-dynamic
+ - arch: arm64
+ runner: ubuntu-24.04-arm
+ artifact: ice-native-arm64-dynamic
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v4
+ with:
+ java-version: '21'
+ distribution: 'graalvm'
+ cache: maven
+ - name: Build native image (dynamic linking - no musl required)
+ run: ./mvnw -Pnative clean install -Dmaven.test.skip=true
+ - name: Run Scenario-Based Integration Tests
+ run: ../mvnw test -Dtest=ScenarioBasedIT -Dice.native=true
+ working-directory: ice-rest-catalog
+ - name: Upload native binary as artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ matrix.artifact }}
+ path: ice/target/ice
+ if-no-files-found: error
diff --git a/README.md b/README.md
index f308e5fc..05b1860e 100644
--- a/README.md
+++ b/README.md
@@ -10,8 +10,14 @@ Create/delete tables, insert data with `ice insert -p ns1.table1 file://example.
## Installation
-Pre-built binaries\* (+ links to Docker images for [ice](https://hub.docker.com/r/altinity/ice) and [ice-rest-catalog](https://hub.docker.com/r/altinity/ice-rest-catalog)) are available from [GitHub Releases](https://github.com/Altinity/ice/releases) page.
-> \* currently require `java` 21+ to run (available [here](https://adoptium.net/installation/)).
+Pre-built binaries (+ links to Docker images for [ice](https://hub.docker.com/r/altinity/ice) and [ice-rest-catalog](https://hub.docker.com/r/altinity/ice-rest-catalog)) are available from [GitHub Releases](https://github.com/Altinity/ice/releases) page.
+
+**Two types of binaries are available:**
+
+1. **Java-based binaries** - Require Java 21+ to run (available [here](https://adoptium.net/installation/))
+2. **Native binaries** - Standalone executables with no Java dependency
+ - `ice-native-amd64` - Dynamic binary for x86_64 Linux (requires glibc)
+ - `ice-native-arm64` - Dynamic binary for ARM64 Linux (requires glibc)
## Usage
@@ -19,6 +25,8 @@ See [examples/](examples/).
## Development
+### Standard Build (Java-based)
+
Install [sdkman](https://sdkman.io/install), then
```shell
@@ -35,6 +43,23 @@ sdk env
./mvnw
```
+### Native Image Build (Standalone)
+
+Build standalone native binaries with no Java dependency:
+
+```shell
+# Install prerequisites
+sdk env # or ensure Java 21+ and GraalVM are available
+
+# Build ice binary (both amd64 and arm64)
+mvn -Pnative -pl ice clean package -Dmaven.test.skip=true
+
+# Docker builds
+docker build -f ice/Dockerfile.native -t ice-native:amd64 .
+
+docker build -f ice/Dockerfile.native -t ice-native:arm64 .
+```
+
## License
Copyright (c) 2025, Altinity Inc and/or its affiliates. All rights reserved.
diff --git a/examples/scratch/README.md b/examples/scratch/README.md
index 011fd715..179eba38 100644
--- a/examples/scratch/README.md
+++ b/examples/scratch/README.md
@@ -37,7 +37,7 @@ ice insert nyc.taxis_p_by_day -p \
# delete partition
ice delete nyc.taxis_p_by_day \
- --partition '[{"name": "tpep_pickup_datetime", "values": ["2024-12-31T23:51:20"]}]' --dry-run=false
+ --partition '[{"name": "tpep_pickup_datetime_day", "values": ["2024-12-31"]}]' --dry-run=false
# insert data ordered by tpep_pickup_datetime column
ice insert nyc.taxis_s_by_day -p \
diff --git a/ice-rest-catalog/pom.xml b/ice-rest-catalog/pom.xml
index 5459aac8..58aa8b15 100644
--- a/ice-rest-catalog/pom.xml
+++ b/ice-rest-catalog/pom.xml
@@ -17,6 +17,7 @@
0.8.5
1.70.0
1.21.4
+ false
@@ -562,6 +563,9 @@
org.apache.maven.plugins
maven-failsafe-plugin
+
+ ${ice.native}
+
**/DockerScenarioBasedIT.java
**/DockerLocalFileIOClickHouseIT.java
diff --git a/ice-rest-catalog/src/test/java/com/altinity/ice/rest/catalog/ScenarioBasedIT.java b/ice-rest-catalog/src/test/java/com/altinity/ice/rest/catalog/ScenarioBasedIT.java
index f001db3c..444f47ab 100644
--- a/ice-rest-catalog/src/test/java/com/altinity/ice/rest/catalog/ScenarioBasedIT.java
+++ b/ice-rest-catalog/src/test/java/com/altinity/ice/rest/catalog/ScenarioBasedIT.java
@@ -23,6 +23,8 @@
*/
public class ScenarioBasedIT extends RESTCatalogTestBase {
+ private static final boolean USE_NATIVE = Boolean.getBoolean("ice.native");
+
@Override
protected ScenarioTestRunner createScenarioRunner(String scenarioName) throws Exception {
Path scenariosDir = getScenariosDirectory();
@@ -42,18 +44,24 @@ protected ScenarioTestRunner createScenarioRunner(String scenarioName) throws Ex
// Try to find ice-jar in the build
String projectRoot = Paths.get("").toAbsolutePath().getParent().toString();
- String iceJar = projectRoot + "/ice/target/ice-jar";
+ String iceJar =
+ USE_NATIVE ? projectRoot + "/ice/target/ice" : projectRoot + "/ice/target/ice-jar";
File iceJarFile = new File(iceJar);
- if (iceJarFile.exists() && iceJarFile.canExecute()) {
- // Use pre-built ice-jar if available
- templateVars.put("ICE_CLI", iceJar);
- logger.info("Using ice-jar from: {}", iceJar);
+ String override = System.getenv("ICE_CLI_OVERRIDE");
+ if (override != null) {
+ templateVars.put("ICE_CLI", override);
} else {
- // Fall back to using local-ice wrapper script
- String localIce = projectRoot + "/.bin/local-ice";
- templateVars.put("ICE_CLI", localIce);
- logger.info("Using local-ice script from: {}", localIce);
+ if (iceJarFile.exists() && iceJarFile.canExecute()) {
+ // Use pre-built ice-jar if available
+ templateVars.put("ICE_CLI", iceJar);
+ logger.info("Using ice-jar from: {}", iceJar);
+ } else {
+ // Fall back to using local-ice wrapper script
+ String localIce = projectRoot + "/.bin/local-ice";
+ templateVars.put("ICE_CLI", localIce);
+ logger.info("Using local-ice script from: {}", localIce);
+ }
}
return new ScenarioTestRunner(scenariosDir, templateVars);
diff --git a/ice-rest-catalog/src/test/resources/scenarios/basic-operations/run.sh.tmpl b/ice-rest-catalog/src/test/resources/scenarios/basic-operations/run.sh.tmpl
index de9184a2..178d17fa 100644
--- a/ice-rest-catalog/src/test/resources/scenarios/basic-operations/run.sh.tmpl
+++ b/ice-rest-catalog/src/test/resources/scenarios/basic-operations/run.sh.tmpl
@@ -30,6 +30,10 @@ echo "OK list-namespaces listed ${NAMESPACE_NAME}"
{{ICE_CLI}} --config {{CLI_CONFIG}} describe
echo "OK Listed namespaces"
+# Check configuration
+{{ICE_CLI}} --config {{CLI_CONFIG}} check
+echo "OK checked configuration"
+
# Insert from file (like README: ice insert flowers.iris -p file://...)
{{ICE_CLI}} --config {{CLI_CONFIG}} insert ${TABLE_IRIS} -p "file://${INPUT_PATH}"
echo "Inserted from file into ${TABLE_IRIS}"
diff --git a/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/input.parquet b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/input.parquet
new file mode 100644
index 00000000..028c64cf
Binary files /dev/null and b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/input.parquet differ
diff --git a/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/run.sh.tmpl b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/run.sh.tmpl
new file mode 100644
index 00000000..fb91a0e1
--- /dev/null
+++ b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/run.sh.tmpl
@@ -0,0 +1,151 @@
+#!/bin/bash
+set -e
+
+echo "Running describe-parquet test..."
+
+SCENARIO_DIR="{{SCENARIO_DIR}}"
+INPUT_PATH="${SCENARIO_DIR}/${INPUT_FILE}"
+TARGET="file://${INPUT_PATH}"
+
+# Default invocation: YAML, summary only
+DEFAULT_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet "${TARGET}")
+for expected in "summary:" "rows: ${EXPECTED_ROWS}" "rowGroups:" "compressedSize:" "uncompressedSize:" "columnCount: ${EXPECTED_COLUMN_COUNT}" "createdBy:"; do
+ if ! grep -qF "${expected}" <<<"${DEFAULT_OUT}"; then
+ echo "FAIL default describe-parquet output missing '${expected}'"
+ printf '%s\n' "${DEFAULT_OUT}"
+ exit 1
+ fi
+done
+if grep -q "^columns:" <<<"${DEFAULT_OUT}"; then
+ echo "FAIL default describe-parquet output should not include columns section"
+ printf '%s\n' "${DEFAULT_OUT}"
+ exit 1
+fi
+echo "OK Default output verified"
+
+# -s / --summary
+SUMMARY_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -s "${TARGET}")
+if ! grep -qF "rows: ${EXPECTED_ROWS}" <<<"${SUMMARY_OUT}"; then
+ echo "FAIL --summary output missing expected row count"
+ printf '%s\n' "${SUMMARY_OUT}"
+ exit 1
+fi
+echo "OK --summary output verified"
+
+# --columns: each iris column with type and repetition
+COLUMNS_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet --columns "${TARGET}")
+if ! grep -q "^columns:" <<<"${COLUMNS_OUT}"; then
+ echo "FAIL --columns output missing 'columns:' section"
+ printf '%s\n' "${COLUMNS_OUT}"
+ exit 1
+fi
+for col in "sepal.length" "sepal.width" "petal.length" "petal.width" "variety"; do
+ if ! grep -qF "name: ${col}" <<<"${COLUMNS_OUT}" && ! grep -qF "name: \"${col}\"" <<<"${COLUMNS_OUT}"; then
+ echo "FAIL --columns output missing column '${col}'"
+ printf '%s\n' "${COLUMNS_OUT}"
+ exit 1
+ fi
+done
+if ! grep -qE 'repetition: "?(REQUIRED|OPTIONAL|REPEATED)"?' <<<"${COLUMNS_OUT}"; then
+ echo "FAIL --columns output missing repetition field"
+ printf '%s\n' "${COLUMNS_OUT}"
+ exit 1
+fi
+if ! grep -qE 'type: "?(DOUBLE|FLOAT|INT32|INT64|BINARY|BOOLEAN|FIXED_LEN_BYTE_ARRAY|INT96)"?' <<<"${COLUMNS_OUT}"; then
+ echo "FAIL --columns output missing primitive type field"
+ printf '%s\n' "${COLUMNS_OUT}"
+ exit 1
+fi
+echo "OK --columns output verified"
+
+# -r / --row-groups (no per-column details)
+ROWGROUPS_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -r "${TARGET}")
+if ! grep -q "^rowGroups:" <<<"${ROWGROUPS_OUT}"; then
+ echo "FAIL -r output missing 'rowGroups:' section"
+ printf '%s\n' "${ROWGROUPS_OUT}"
+ exit 1
+fi
+for expected in "index:" "rowCount:" "totalSize:" "compressedSize:" "startingPos:"; do
+ if ! grep -qF "${expected}" <<<"${ROWGROUPS_OUT}"; then
+ echo "FAIL -r output missing '${expected}'"
+ printf '%s\n' "${ROWGROUPS_OUT}"
+ exit 1
+ fi
+done
+if grep -qE "encodings:|codec:" <<<"${ROWGROUPS_OUT}"; then
+ echo "FAIL -r output should not include per-column details (encodings/codec)"
+ printf '%s\n' "${ROWGROUPS_OUT}"
+ exit 1
+fi
+echo "OK -r output verified"
+
+# -d / --row-group-details: encodings, codec, stats
+DETAILS_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -d "${TARGET}")
+for expected in "rowGroups:" "encodings:" "codec:" "valueCount:" "path:"; do
+ if ! grep -qF "${expected}" <<<"${DETAILS_OUT}"; then
+ echo "FAIL -d output missing '${expected}'"
+ printf '%s\n' "${DETAILS_OUT}"
+ exit 1
+ fi
+done
+if ! grep -q "nulls:" <<<"${DETAILS_OUT}"; then
+ echo "FAIL -d output missing column stats ('nulls:')"
+ printf '%s\n' "${DETAILS_OUT}"
+ exit 1
+fi
+echo "OK -d output verified"
+
+# -a / --all: every section present
+ALL_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -a "${TARGET}")
+for expected in "summary:" "columns:" "rowGroups:" "encodings:" "codec:" "nulls:"; do
+ if ! grep -qF "${expected}" <<<"${ALL_OUT}"; then
+ echo "FAIL -a output missing '${expected}'"
+ printf '%s\n' "${ALL_OUT}"
+ exit 1
+ fi
+done
+echo "OK -a output verified"
+
+# --json: JSON output instead of YAML
+JSON_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -a --json "${TARGET}")
+if ! grep -q '^{' <<<"${JSON_OUT}"; then
+ echo "FAIL --json output is not a JSON object"
+ printf '%s\n' "${JSON_OUT}"
+ exit 1
+fi
+for expected in '"summary"' '"columns"' '"rowGroups"' "\"rows\":${EXPECTED_ROWS}" "\"columnCount\":${EXPECTED_COLUMN_COUNT}"; do
+ if ! grep -qF "${expected}" <<<"${JSON_OUT}"; then
+ echo "FAIL --json output missing '${expected}'"
+ printf '%s\n' "${JSON_OUT}"
+ exit 1
+ fi
+done
+if grep -qE "^summary:" <<<"${JSON_OUT}"; then
+ echo "FAIL --json output looks like YAML"
+ printf '%s\n' "${JSON_OUT}"
+ exit 1
+fi
+echo "OK --json output verified"
+
+# Combined --summary --columns: both sections, no rowGroups
+COMBINED_OUT=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet -s --columns "${TARGET}")
+if ! grep -q "^summary:" <<<"${COMBINED_OUT}" || ! grep -q "^columns:" <<<"${COMBINED_OUT}"; then
+ echo "FAIL combined -s --columns missing summary or columns section"
+ printf '%s\n' "${COMBINED_OUT}"
+ exit 1
+fi
+if grep -q "^rowGroups:" <<<"${COMBINED_OUT}"; then
+ echo "FAIL combined -s --columns should not include rowGroups section"
+ printf '%s\n' "${COMBINED_OUT}"
+ exit 1
+fi
+echo "OK Combined --summary --columns output verified"
+
+# Missing file should fail
+if {{ICE_CLI}} --config {{CLI_CONFIG}} describe-parquet "file://${SCENARIO_DIR}/does-not-exist.parquet" >/dev/null 2>&1; then
+ echo "FAIL describe-parquet should fail on missing file"
+ exit 1
+fi
+echo "OK Missing file rejected"
+
+echo "Describe-parquet test completed successfully"
diff --git a/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/scenario.yaml b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/scenario.yaml
new file mode 100644
index 00000000..8e878c9c
--- /dev/null
+++ b/ice-rest-catalog/src/test/resources/scenarios/describe-parquet/scenario.yaml
@@ -0,0 +1,10 @@
+name: "Describe parquet metadata"
+description: "Tests describe-parquet against a local iris parquet file across all option flags and both YAML and JSON output formats"
+
+catalogConfig:
+ warehouse: "s3://test-bucket/warehouse"
+
+env:
+ INPUT_FILE: "input.parquet"
+ EXPECTED_ROWS: "150"
+ EXPECTED_COLUMN_COUNT: "5"
diff --git a/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/run.sh.tmpl b/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/run.sh.tmpl
index 4a076deb..e4fde013 100644
--- a/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/run.sh.tmpl
+++ b/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/run.sh.tmpl
@@ -45,9 +45,114 @@ if [ "${SECOND_LINES}" -le "${FIRST_LINES}" ]; then
fi
echo "OK Second scan: ${SECOND_LINES} lines (rows inserted)"
+# alter_column: add an int column then widen to long
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"add_column","name":"an_int","type":"int"}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -s ${TABLE_NAME} > /tmp/schema_ev_int.txt
+if ! grep -qF 'an_int: optional int' /tmp/schema_ev_int.txt; then
+ echo "FAIL add_column an_int as int not visible"
+ cat /tmp/schema_ev_int.txt
+ exit 1
+fi
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"alter_column","name":"an_int","type":"long"}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -s ${TABLE_NAME} > /tmp/schema_ev_long.txt
+if ! grep -qF 'an_int: optional long' /tmp/schema_ev_long.txt; then
+ echo "FAIL alter_column int->long not applied"
+ cat /tmp/schema_ev_long.txt
+ exit 1
+fi
+echo "OK alter_column promoted int to long"
+
+# rename_column an_int -> a_long
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"rename_column","name":"an_int","new_name":"a_long"}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -s ${TABLE_NAME} > /tmp/schema_ev_rename.txt
+if grep -qF ' an_int:' /tmp/schema_ev_rename.txt; then
+ echo "FAIL rename_column: old name 'an_int' still present"
+ cat /tmp/schema_ev_rename.txt
+ exit 1
+fi
+if ! grep -qF 'a_long: optional long' /tmp/schema_ev_rename.txt; then
+ echo "FAIL rename_column: new name 'a_long' not visible"
+ cat /tmp/schema_ev_rename.txt
+ exit 1
+fi
+echo "OK rename_column an_int -> a_long"
+
+# drop_column 'extra'
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"drop_column","name":"extra"}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -s ${TABLE_NAME} > /tmp/schema_ev_drop.txt
+if grep -qF ' extra:' /tmp/schema_ev_drop.txt; then
+ echo "FAIL drop_column: 'extra' still present"
+ cat /tmp/schema_ev_drop.txt
+ exit 1
+fi
+echo "OK drop_column 'extra' removed"
+
+# set_tblproperty: set then remove (value=null)
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"set_tblproperty","key":"owner","value":"qa"}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -p ${TABLE_NAME} > /tmp/schema_ev_props_set.txt
+if ! grep -qF 'owner: qa' /tmp/schema_ev_props_set.txt; then
+ echo "FAIL set_tblproperty owner=qa not visible in describe -p"
+ cat /tmp/schema_ev_props_set.txt
+ exit 1
+fi
+echo "OK set_tblproperty owner=qa"
+
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} $'[{"op":"set_tblproperty","key":"owner","value":null}]'
+{{ICE_CLI}} --config {{CLI_CONFIG}} describe -p ${TABLE_NAME} > /tmp/schema_ev_props_unset.txt
+if grep -qF 'owner: qa' /tmp/schema_ev_props_unset.txt; then
+ echo "FAIL set_tblproperty value=null did not remove 'owner'"
+ cat /tmp/schema_ev_props_unset.txt
+ exit 1
+fi
+echo "OK set_tblproperty value=null removed 'owner'"
+
+# rename_to: ensure new name appears and old name disappears
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_NAME} "[{\"op\":\"rename_to\",\"new_name\":\"${TABLE_RENAMED}\"}]"
+{{ICE_CLI}} --config {{CLI_CONFIG}} list-tables ${NAMESPACE_NAME} > /tmp/schema_ev_rename_to.txt
+LISTED_NAMES=$(awk '/^- /{sub(/^- */,""); print}' /tmp/schema_ev_rename_to.txt)
+if grep -qFx "${TABLE_NAME}" <<<"${LISTED_NAMES}"; then
+ echo "FAIL rename_to: original table ${TABLE_NAME} still listed"
+ cat /tmp/schema_ev_rename_to.txt
+ exit 1
+fi
+if ! grep -qFx "${TABLE_RENAMED}" <<<"${LISTED_NAMES}"; then
+ echo "FAIL rename_to: renamed table ${TABLE_RENAMED} not listed"
+ cat /tmp/schema_ev_rename_to.txt
+ exit 1
+fi
+echo "OK rename_to ${TABLE_RENAMED}"
+
+# Rename back so the existing cleanup path still works
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_RENAMED} "[{\"op\":\"rename_to\",\"new_name\":\"${TABLE_NAME}\"}]"
+
+# drop_partition_field: needs a partitioned table
+{{ICE_CLI}} --config {{CLI_CONFIG}} insert --create-table ${TABLE_PARTITIONED} "file://${INPUT_PATH}" \
+ --partition='[{"column":"variety","transform":"identity"}]'
+PART_BEFORE=$({{ICE_CLI}} --config {{CLI_CONFIG}} list-partitions ${TABLE_PARTITIONED})
+if ! grep -q "variety=" <<<"${PART_BEFORE}"; then
+ echo "FAIL partitioned table missing 'variety=' partition entries before drop"
+ printf '%s\n' "${PART_BEFORE}"
+ exit 1
+fi
+{{ICE_CLI}} --config {{CLI_CONFIG}} alter-table ${TABLE_PARTITIONED} $'[{"op":"drop_partition_field","name":"variety"}]'
+DESCRIBE_PART=$({{ICE_CLI}} --config {{CLI_CONFIG}} describe -s ${TABLE_PARTITIONED})
+# After dropping, the partition spec should no longer reference 'variety' as an active field.
+# Iceberg renders dropped fields as "void()" in the spec; an active identity partition shows as "identity(variety)".
+if grep -qE "identity\(variety\)" <<<"${DESCRIBE_PART}"; then
+ echo "FAIL drop_partition_field: identity(variety) still active in spec"
+ printf '%s\n' "${DESCRIBE_PART}"
+ exit 1
+fi
+echo "OK drop_partition_field 'variety'"
+
# Cleanup
{{ICE_CLI}} --config {{CLI_CONFIG}} delete-table ${TABLE_NAME}
+{{ICE_CLI}} --config {{CLI_CONFIG}} delete-table ${TABLE_PARTITIONED}
{{ICE_CLI}} --config {{CLI_CONFIG}} delete-namespace ${NAMESPACE_NAME}
+rm -f /tmp/schema_ev_describe.txt /tmp/schema_ev_scan1.txt /tmp/schema_ev_scan2.txt \
+ /tmp/schema_ev_int.txt /tmp/schema_ev_long.txt /tmp/schema_ev_rename.txt \
+ /tmp/schema_ev_drop.txt /tmp/schema_ev_props_set.txt /tmp/schema_ev_props_unset.txt \
+ /tmp/schema_ev_rename_to.txt
echo "OK Cleanup done"
echo "Schema evolution test completed successfully"
diff --git a/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/scenario.yaml b/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/scenario.yaml
index 8a753b63..684274be 100644
--- a/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/scenario.yaml
+++ b/ice-rest-catalog/src/test/resources/scenarios/schema-evolution/scenario.yaml
@@ -1,5 +1,5 @@
name: "Schema evolution (add, drop, rename)"
-description: "Tests alter-table: add column, drop column, rename column"
+description: "Tests alter-table: add_column, alter_column, rename_column, drop_column, set_tblproperty, rename_to, drop_partition_field"
catalogConfig:
warehouse: "s3://test-bucket/warehouse"
@@ -7,3 +7,5 @@ catalogConfig:
env:
NAMESPACE_NAME: "test_schema_ev"
TABLE_NAME: "test_schema_ev.t1"
+ TABLE_RENAMED: "test_schema_ev.t1_renamed"
+ TABLE_PARTITIONED: "test_schema_ev.t_part"
diff --git a/ice/Dockerfile.native b/ice/Dockerfile.native
new file mode 100644
index 00000000..10961656
--- /dev/null
+++ b/ice/Dockerfile.native
@@ -0,0 +1,33 @@
+# Dockerfile for building ICE native image (mostly-static with dynamic libc)
+# Usage (amd64): docker build -f ice/Dockerfile.native -t ice-native:amd64 .
+# Usage (arm64): docker build -f ice/Dockerfile.native -t ice-native:arm64 .
+
+FROM ghcr.io/graalvm/native-image-community:21 AS builder
+
+WORKDIR /workspace
+
+# Copy license header file (required by license-maven-plugin)
+COPY apache-header.txt .
+
+# Copy Maven files for dependency resolution
+COPY mvnw .
+COPY .mvn .mvn
+COPY pom.xml .
+COPY ice/pom.xml ice/
+COPY ice-rest-catalog/pom.xml ice-rest-catalog/
+
+# Download dependencies (cached layer)
+RUN ./mvnw dependency:go-offline -pl ice || true
+
+# Copy source code
+COPY ice/src ice/src
+
+# Build mostly-static native image (everything statically linked except libc)
+RUN ./mvnw -Pnative -pl ice clean package -Dmaven.test.skip=true
+
+# ============================================================================
+# Final stage: distroless base (includes minimal glibc runtime)
+# ============================================================================
+FROM gcr.io/distroless/base-debian12:nonroot
+COPY --from=builder /workspace/ice/target/ice /ice
+ENTRYPOINT ["/ice"]
diff --git a/ice/pom.xml b/ice/pom.xml
index b200694b..61c5d41f 100644
--- a/ice/pom.xml
+++ b/ice/pom.xml
@@ -667,5 +667,41 @@
+
+ native
+
+
+
+ org.graalvm.buildtools
+ native-maven-plugin
+ ${native.maven.plugin.version}
+ true
+
+
+ build-native
+
+ compile-no-fork
+
+ package
+
+
+
+ ice
+ com.altinity.ice.cli.Main
+
+
+ --initialize-at-run-time=io.netty
+ --initialize-at-run-time=ch.qos.logback
+
+ -H:+StaticExecutableWithDynamicLibC
+
+ -H:+RemoveUnusedSymbols
+ -H:+ReportExceptionStackTraces
+
+
+
+
+
+
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/jni-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/jni-config.json
new file mode 100644
index 00000000..c681d3ef
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/jni-config.json
@@ -0,0 +1,30 @@
+[
+{
+ "name":"com.github.luben.zstd.ZstdInputStreamNoFinalizer",
+ "fields":[{"name":"dstPos"}, {"name":"srcPos"}]
+},
+{
+ "name":"com.github.luben.zstd.ZstdOutputStreamNoFinalizer",
+ "fields":[{"name":"dstPos"}, {"name":"srcPos"}]
+},
+{
+ "name":"java.lang.Boolean",
+ "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"org.jline.nativ.CLibrary",
+ "fields":[{"name":"TCSADRAIN"}, {"name":"TCSAFLUSH"}, {"name":"TCSANOW"}, {"name":"TIOCGWINSZ"}, {"name":"TIOCSWINSZ"}]
+},
+{
+ "name":"org.jline.nativ.CLibrary$Termios",
+ "fields":[{"name":"SIZEOF"}, {"name":"c_cc"}, {"name":"c_cflag"}, {"name":"c_iflag"}, {"name":"c_ispeed"}, {"name":"c_lflag"}, {"name":"c_oflag"}, {"name":"c_ospeed"}]
+},
+{
+ "name":"org.jline.nativ.CLibrary$WinSize",
+ "fields":[{"name":"SIZEOF"}, {"name":"ws_col"}, {"name":"ws_row"}, {"name":"ws_xpixel"}, {"name":"ws_ypixel"}]
+},
+{
+ "name":"sun.management.VMManagementImpl",
+ "fields":[{"name":"compTimeMonitoringSupport"}, {"name":"currentThreadCpuTimeSupport"}, {"name":"objectMonitorUsageSupport"}, {"name":"otherThreadCpuTimeSupport"}, {"name":"remoteDiagnosticCommandsSupport"}, {"name":"synchronizerUsageSupport"}, {"name":"threadAllocatedMemorySupport"}, {"name":"threadContentionMonitoringSupport"}]
+}
+]
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/predefined-classes-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/predefined-classes-config.json
new file mode 100644
index 00000000..0e79b2c5
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/predefined-classes-config.json
@@ -0,0 +1,8 @@
+[
+ {
+ "type":"agent-extracted",
+ "classes":[
+ ]
+ }
+]
+
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/proxy-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/proxy-config.json
new file mode 100644
index 00000000..4a9716c1
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/proxy-config.json
@@ -0,0 +1,5 @@
+[
+ {
+ "interfaces":["sun.misc.SignalHandler"]
+ }
+]
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/reflect-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/reflect-config.json
new file mode 100644
index 00000000..70a02591
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/reflect-config.json
@@ -0,0 +1,1201 @@
+[
+{
+ "name":"[B"
+},
+{
+ "name":"[Lcom.altinity.ice.cli.Main$IcePartition;"
+},
+{
+ "name":"[Lcom.altinity.ice.cli.Main$IceSortOrder;"
+},
+{
+ "name":"[Lcom.altinity.ice.cli.Main$PartitionFilter;"
+},
+{
+ "name":"[Lcom.altinity.ice.cli.internal.cmd.AlterTable$Update;"
+},
+{
+ "name":"[Lcom.altinity.ice.cli.internal.cmd.DescribeMetadata$ManifestInfo;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.deser.BeanDeserializerModifier;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.deser.Deserializers;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.deser.KeyDeserializers;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.deser.ValueInstantiators;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.ser.BeanSerializerModifier;"
+},
+{
+ "name":"[Lcom.fasterxml.jackson.databind.ser.Serializers;"
+},
+{
+ "name":"[Ljava.lang.Object;"
+},
+{
+ "name":"[Ljava.lang.String;"
+},
+{
+ "name":"[Ljava.util.List;"
+},
+{
+ "name":"[Ljava.util.Map$Entry;"
+},
+{
+ "name":"[Lorg.apache.avro.util.springframework.ConcurrentReferenceHashMap$Segment;"
+},
+{
+ "name":"[Lorg.apache.iceberg.Accessor;"
+},
+{
+ "name":"[Lorg.apache.iceberg.avro.ValueWriter;"
+},
+{
+ "name":"[Lorg.apache.iceberg.parquet.ParquetValueReader;"
+},
+{
+ "name":"[Lorg.apache.iceberg.parquet.ParquetValueWriter;"
+},
+{
+ "name":"[Lorg.apache.iceberg.parquet.TripleIterator;"
+},
+{
+ "name":"[Lorg.apache.iceberg.relocated.com.google.common.collect.ImmutableMapEntry;"
+},
+{
+ "name":"[Lsun.security.pkcs.SignerInfo;"
+},
+{
+ "name":"ch.qos.logback.classic.joran.SerializedModelConfigurator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.classic.util.DefaultJoranConfigurator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"ch.qos.logback.core.ConsoleAppender",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setTarget","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.Layout",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.OutputStreamAppender",
+ "methods":[{"name":"setEncoder","parameterTypes":["ch.qos.logback.core.encoder.Encoder"] }]
+},
+{
+ "name":"ch.qos.logback.core.encoder.Encoder",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.encoder.LayoutWrappingEncoder",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"setLayout","parameterTypes":["ch.qos.logback.core.Layout"] }, {"name":"setParent","parameterTypes":["ch.qos.logback.core.spi.ContextAware"] }]
+},
+{
+ "name":"ch.qos.logback.core.pattern.PatternLayoutBase",
+ "methods":[{"name":"setPattern","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"ch.qos.logback.core.spi.ContextAware",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.Main",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "methods":[{"name":"alterTable","parameterTypes":["java.lang.String","java.lang.String"] }, {"name":"check","parameterTypes":[] }, {"name":"createNamespace","parameterTypes":["java.lang.String","boolean"] }, {"name":"createTable","parameterTypes":["java.lang.String","java.lang.String","boolean","boolean","java.lang.String","boolean","java.lang.String","java.lang.String","java.lang.String"] }, {"name":"delete","parameterTypes":["java.lang.String","java.lang.String","java.lang.Boolean"] }, {"name":"deleteNamespace","parameterTypes":["java.lang.String","boolean"] }, {"name":"deleteTable","parameterTypes":["java.lang.String","boolean","boolean"] }, {"name":"describe","parameterTypes":["java.lang.String","boolean","boolean","boolean","boolean","boolean"] }, {"name":"describeMetadata","parameterTypes":["java.lang.String","boolean","boolean","boolean","boolean","boolean","boolean","boolean"] }, {"name":"describeParquet","parameterTypes":["java.lang.String","boolean","boolean","boolean","boolean","boolean","boolean","java.lang.String","boolean"] }, {"name":"files","parameterTypes":["java.lang.String"] }, {"name":"insert","parameterTypes":["java.lang.String","boolean","java.lang.String[]","java.lang.String","boolean","boolean","boolean","java.lang.String","boolean","boolean","int","boolean","com.altinity.ice.cli.internal.cmd.Insert$DataFileNamingStrategy$Name","boolean","boolean","java.lang.String","int","java.lang.String","java.lang.String","boolean","int","java.lang.String","java.lang.String","java.lang.String","boolean","java.lang.String"] }, {"name":"listNamespaces","parameterTypes":["java.lang.String","boolean"] }, {"name":"listPartitions","parameterTypes":["java.lang.String","boolean"] }, {"name":"listTables","parameterTypes":["java.lang.String","boolean"] }, {"name":"scanTable","parameterTypes":["java.lang.String","int","boolean"] }, {"name":"shell","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.Main$IcePartition",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.Main$IceSortOrder",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","boolean","boolean"] }]
+},
+{
+ "name":"com.altinity.ice.cli.Main$PartitionFilter",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.util.List"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$AddColumn",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String"] }, {"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.String","java.lang.Boolean"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$AlterColumn",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$DropColumn",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$DropPartitionField",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$RenameColumn",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$RenameTo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$SetTblProperty",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.AlterTable$Update",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.Describe$Table",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"data","parameterTypes":[] }, {"name":"error","parameterTypes":[] }, {"name":"kind","parameterTypes":[] }, {"name":"metadata","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.Describe$Table$Data",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"currentSnapshot","parameterTypes":[] }, {"name":"location","parameterTypes":[] }, {"name":"metrics","parameterTypes":[] }, {"name":"partitionSpecRaw","parameterTypes":[] }, {"name":"properties","parameterTypes":[] }, {"name":"schemaRaw","parameterTypes":[] }, {"name":"sortOrderRaw","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.Describe$Table$Error",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.Describe$Table$Metadata",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"id","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.Describe$Table$Snapshot",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"id","parameterTypes":[] }, {"name":"location","parameterTypes":[] }, {"name":"operation","parameterTypes":[] }, {"name":"parentID","parameterTypes":[] }, {"name":"sequenceNumber","parameterTypes":[] }, {"name":"summary","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"timestampISO","parameterTypes":[] }, {"name":"timestampISOLocal","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$DataFileInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"columnSizes","parameterTypes":[] }, {"name":"fileSizeInBytes","parameterTypes":[] }, {"name":"format","parameterTypes":[] }, {"name":"lowerBounds","parameterTypes":[] }, {"name":"nullValueCounts","parameterTypes":[] }, {"name":"partition","parameterTypes":[] }, {"name":"path","parameterTypes":[] }, {"name":"recordCount","parameterTypes":[] }, {"name":"upperBounds","parameterTypes":[] }, {"name":"valueCounts","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$FieldInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"fieldId","parameterTypes":[] }, {"name":"name","parameterTypes":[] }, {"name":"required","parameterTypes":[] }, {"name":"type","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$HistoryInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"metadataLog","parameterTypes":[] }, {"name":"snapshotLog","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$ManifestInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"addedFilesCount","parameterTypes":[] }, {"name":"dataFiles","parameterTypes":[] }, {"name":"deletedFilesCount","parameterTypes":[] }, {"name":"existingFilesCount","parameterTypes":[] }, {"name":"partitionSpecId","parameterTypes":[] }, {"name":"path","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$MetadataInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"history","parameterTypes":[] }, {"name":"manifests","parameterTypes":[] }, {"name":"schema","parameterTypes":[] }, {"name":"snapshots","parameterTypes":[] }, {"name":"summary","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$MetadataLogEntry",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"file","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"timestampMillis","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$SchemaInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"fields","parameterTypes":[] }, {"name":"schemaId","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$SnapshotInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"manifestListLocation","parameterTypes":[] }, {"name":"operation","parameterTypes":[] }, {"name":"parentId","parameterTypes":[] }, {"name":"sequenceNumber","parameterTypes":[] }, {"name":"snapshotId","parameterTypes":[] }, {"name":"summary","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"timestampMillis","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$SnapshotLogEntry",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"snapshotId","parameterTypes":[] }, {"name":"timestamp","parameterTypes":[] }, {"name":"timestampMillis","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeMetadata$Summary",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"currentSnapshotId","parameterTypes":[] }, {"name":"formatVersion","parameterTypes":[] }, {"name":"lastUpdated","parameterTypes":[] }, {"name":"lastUpdatedMillis","parameterTypes":[] }, {"name":"location","parameterTypes":[] }, {"name":"numSnapshots","parameterTypes":[] }, {"name":"partitionSpec","parameterTypes":[] }, {"name":"properties","parameterTypes":[] }, {"name":"sortOrder","parameterTypes":[] }, {"name":"uuid","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$Column",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"logicalType","parameterTypes":[] }, {"name":"name","parameterTypes":[] }, {"name":"repetition","parameterTypes":[] }, {"name":"type","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$ColumnChunk",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"codec","parameterTypes":[] }, {"name":"encodings","parameterTypes":[] }, {"name":"path","parameterTypes":[] }, {"name":"stats","parameterTypes":[] }, {"name":"totalSize","parameterTypes":[] }, {"name":"type","parameterTypes":[] }, {"name":"uncompressedSize","parameterTypes":[] }, {"name":"valueCount","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$ColumnStats",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"max","parameterTypes":[] }, {"name":"min","parameterTypes":[] }, {"name":"nulls","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$ParquetInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"columns","parameterTypes":[] }, {"name":"rowGroups","parameterTypes":[] }, {"name":"summary","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$RowGroup",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"columns","parameterTypes":[] }, {"name":"compressedSize","parameterTypes":[] }, {"name":"index","parameterTypes":[] }, {"name":"rowCount","parameterTypes":[] }, {"name":"startingPos","parameterTypes":[] }, {"name":"totalSize","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.DescribeParquet$Summary",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"columnCount","parameterTypes":[] }, {"name":"compressedSize","parameterTypes":[] }, {"name":"createdBy","parameterTypes":[] }, {"name":"rowGroups","parameterTypes":[] }, {"name":"rows","parameterTypes":[] }, {"name":"uncompressedSize","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.ListNamespaces$Result",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"namespaces","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.ListPartitions$PartitionFieldInfo",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"name","parameterTypes":[] }, {"name":"sourceColumn","parameterTypes":[] }, {"name":"transform","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.ListPartitions$Result",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"partitionSpec","parameterTypes":[] }, {"name":"partitions","parameterTypes":[] }, {"name":"table","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.cmd.ListTables$Result",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"namespace","parameterTypes":[] }, {"name":"tables","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.config.Config",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","java.lang.String","java.lang.Boolean","java.lang.String","java.lang.String","java.lang.String","java.lang.String[]","com.altinity.ice.cli.internal.config.Config$S3","java.util.Map"] }]
+},
+{
+ "name":"com.altinity.ice.cli.internal.config.Config$S3",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":["java.lang.String","boolean","java.lang.String","java.lang.String","java.lang.String"] }]
+},
+{
+ "name":"com.altinity.ice.internal.iceberg.io.SchemeFileIO",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.internal.logback.ColorAwarePatternLayout",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.internal.logback.ColorAwarePatternLayout$NoColorConverter",
+ "queryAllPublicMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.altinity.ice.internal.picocli.VersionProvider",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BBHeader$ReadAndWriteCounterRef",
+ "fields":[{"name":"writeCounter"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BBHeader$ReadCounterRef",
+ "fields":[{"name":"readCounter"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BLCHeader$DrainStatusRef",
+ "fields":[{"name":"drainStatus"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueColdProducerFields",
+ "fields":[{"name":"producerLimit"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueConsumerFields",
+ "fields":[{"name":"consumerIndex"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BaseMpscLinkedArrayQueueProducerFields",
+ "fields":[{"name":"producerIndex"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.BoundedLocalCache",
+ "fields":[{"name":"refreshes"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.CacheLoader",
+ "methods":[{"name":"loadAll","parameterTypes":["java.util.Set"] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.FD",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.FDMS",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.FS",
+ "fields":[{"name":"key"}, {"name":"value"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.PS",
+ "fields":[{"name":"key"}, {"name":"value"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.PSA",
+ "fields":[{"name":"accessTime"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.PW",
+ "fields":[{"name":"value"}],
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.SI",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.SSA",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.SSLA",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.StripedBuffer",
+ "fields":[{"name":"tableBusy"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.UnboundedLocalCache",
+ "fields":[{"name":"refreshes"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.WILSMS",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.WS",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.github.benmanes.caffeine.cache.WSL",
+ "fields":[{"name":"FACTORY"}]
+},
+{
+ "name":"com.sun.crypto.provider.AESCipher$General",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.ARCFOURCipher",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.ChaCha20Cipher$ChaCha20Poly1305",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.DESCipher",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.DESedeCipher",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.DHParameters",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.GaloisCounterMode$AESGCM",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.HmacCore$HmacSHA256",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.crypto.provider.TlsMasterSecretGenerator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"groovy.lang.Closure"
+},
+{
+ "name":"java.io.Console",
+ "methods":[{"name":"isTerminal","parameterTypes":[] }]
+},
+{
+ "name":"java.io.Serializable",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.Class",
+ "methods":[{"name":"getRecordComponents","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.Comparable",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.Double",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"java.lang.Iterable",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.Number",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.Object",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.Record",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.String"
+},
+{
+ "name":"java.lang.System",
+ "methods":[{"name":"console","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.Thread",
+ "fields":[{"name":"threadLocalRandomProbe"}]
+},
+{
+ "name":"java.lang.constant.Constable",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.constant.ConstantDesc",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.lang.reflect.Executable",
+ "methods":[{"name":"getParameters","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.reflect.Method"
+},
+{
+ "name":"java.lang.reflect.Parameter",
+ "methods":[{"name":"getName","parameterTypes":[] }]
+},
+{
+ "name":"java.lang.reflect.RecordComponent",
+ "methods":[{"name":"getName","parameterTypes":[] }, {"name":"getType","parameterTypes":[] }]
+},
+{
+ "name":"java.nio.file.Path"
+},
+{
+ "name":"java.nio.file.Paths",
+ "methods":[{"name":"get","parameterTypes":["java.lang.String","java.lang.String[]"] }]
+},
+{
+ "name":"java.security.AlgorithmParametersSpi"
+},
+{
+ "name":"java.security.KeyStoreSpi"
+},
+{
+ "name":"java.security.SecureRandomParameters"
+},
+{
+ "name":"java.security.interfaces.ECPrivateKey"
+},
+{
+ "name":"java.security.interfaces.ECPublicKey"
+},
+{
+ "name":"java.security.interfaces.RSAPrivateKey"
+},
+{
+ "name":"java.security.interfaces.RSAPublicKey"
+},
+{
+ "name":"java.sql.Connection"
+},
+{
+ "name":"java.sql.Date"
+},
+{
+ "name":"java.sql.Driver"
+},
+{
+ "name":"java.sql.DriverManager",
+ "methods":[{"name":"getConnection","parameterTypes":["java.lang.String"] }, {"name":"getDriver","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.sql.Time",
+ "methods":[{"name":"","parameterTypes":["long"] }]
+},
+{
+ "name":"java.sql.Timestamp",
+ "methods":[{"name":"valueOf","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.time.Duration",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.Instant",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.LocalDate",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.LocalDateTime",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.LocalTime",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.MonthDay",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.OffsetDateTime",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.OffsetTime",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.Period",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.Year",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.YearMonth",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.time.ZoneId",
+ "methods":[{"name":"of","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.time.ZoneOffset",
+ "methods":[{"name":"of","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"java.time.ZonedDateTime",
+ "methods":[{"name":"parse","parameterTypes":["java.lang.CharSequence"] }]
+},
+{
+ "name":"java.util.AbstractCollection",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.Collection",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.Collections$UnmodifiableMap",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"java.util.Date"
+},
+{
+ "name":"java.util.ImmutableCollections$AbstractImmutableCollection",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.ImmutableCollections$AbstractImmutableList",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.ImmutableCollections$ListN",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"java.util.List",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.Map",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.RandomAccess",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"java.util.concurrent.ForkJoinTask",
+ "fields":[{"name":"aux"}, {"name":"status"}]
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicBoolean",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicMarkableReference",
+ "fields":[{"name":"pair"}]
+},
+{
+ "name":"java.util.concurrent.atomic.AtomicReference",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"java.util.concurrent.atomic.Striped64",
+ "fields":[{"name":"base"}, {"name":"cellsBusy"}]
+},
+{
+ "name":"java.util.concurrent.atomic.Striped64$Cell",
+ "fields":[{"name":"value"}]
+},
+{
+ "name":"javax.security.auth.x500.X500Principal",
+ "fields":[{"name":"thisX500Name"}],
+ "methods":[{"name":"","parameterTypes":["sun.security.x509.X500Name"] }]
+},
+{
+ "name":"jdk.internal.misc.Unsafe"
+},
+{
+ "name":"kotlin.Unit"
+},
+{
+ "name":"manifest_entry"
+},
+{
+ "name":"org.apache.commons.logging.LogFactory"
+},
+{
+ "name":"org.apache.commons.logging.impl.Log4JLogger",
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }, {"name":"setLogFactory","parameterTypes":["org.apache.commons.logging.LogFactory"] }]
+},
+{
+ "name":"org.apache.commons.logging.impl.LogFactoryImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.commons.logging.impl.WeakHashtable",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.hadoop.fs.FSDataInputStream"
+},
+{
+ "name":"org.apache.hadoop.mapred.JobConf"
+},
+{
+ "name":"org.apache.hadoop.mapred.JobConfigurable"
+},
+{
+ "name":"org.apache.hadoop.thirdparty.com.google.common.util.concurrent.AbstractFuture",
+ "fields":[{"name":"listeners"}, {"name":"value"}, {"name":"waiters"}]
+},
+{
+ "name":"org.apache.hadoop.thirdparty.com.google.common.util.concurrent.AbstractFuture$Waiter",
+ "fields":[{"name":"next"}, {"name":"thread"}]
+},
+{
+ "name":"org.apache.http.client.config.RequestConfig$Builder",
+ "methods":[{"name":"setNormalizeUri","parameterTypes":["boolean"] }]
+},
+{
+ "name":"org.apache.iceberg.GenericDataFile",
+ "methods":[{"name":"","parameterTypes":["org.apache.iceberg.types.Types$StructType"] }]
+},
+{
+ "name":"org.apache.iceberg.GenericManifestEntry",
+ "methods":[{"name":"","parameterTypes":["org.apache.iceberg.types.Types$StructType"] }]
+},
+{
+ "name":"org.apache.iceberg.GenericManifestFile",
+ "methods":[{"name":"","parameterTypes":["org.apache.avro.Schema"] }]
+},
+{
+ "name":"org.apache.iceberg.GenericPartitionFieldSummary",
+ "methods":[{"name":"","parameterTypes":["org.apache.avro.Schema"] }]
+},
+{
+ "name":"org.apache.iceberg.PartitionData",
+ "methods":[{"name":"","parameterTypes":["org.apache.iceberg.types.Types$StructType"] }]
+},
+{
+ "name":"org.apache.iceberg.aws.ApacheHttpClientConfigurations",
+ "methods":[{"name":"create","parameterTypes":["java.util.Map"] }]
+},
+{
+ "name":"org.apache.iceberg.aws.AwsClientFactories$DefaultAwsClientFactory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.iceberg.aws.s3.S3FileIO",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.iceberg.hadoop.HadoopMetricsContext",
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }]
+},
+{
+ "name":"org.apache.iceberg.relocated.com.google.common.collect.BiMap",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.relocated.com.google.common.collect.ImmutableBiMap",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.relocated.com.google.common.collect.RegularImmutableMap",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.apache.iceberg.relocated.com.google.common.collect.SingletonImmutableBiMap",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.apache.iceberg.rest.RESTMessage",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.rest.RESTRequest",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.rest.RESTResponse",
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"org.apache.iceberg.rest.requests.CreateNamespaceRequest",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.apache.iceberg.rest.requests.CreateTableRequest",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.apache.iceberg.rest.requests.RenameTableRequest",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true
+},
+{
+ "name":"org.apache.iceberg.rest.responses.CreateNamespaceResponse",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.iceberg.rest.responses.ListNamespacesResponse",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.iceberg.rest.responses.ListTablesResponse",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "queryAllDeclaredConstructors":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.iceberg.util.Pair$1"
+},
+{
+ "name":"org.apache.log4j.Level",
+ "fields":[{"name":"TRACE"}]
+},
+{
+ "name":"org.apache.log4j.Priority"
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.ByteBitPackingBE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.ByteBitPackingForLongBE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.ByteBitPackingForLongLE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.ByteBitPackingLE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.LemireBitPackingBE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.column.values.bitpacking.LemireBitPackingLE",
+ "fields":[{"name":"factory"}]
+},
+{
+ "name":"org.apache.parquet.hadoop.codec.SnappyCodec",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.apache.parquet.hadoop.codec.ZstandardCodec",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.brotli.dec.BrotliInputStream"
+},
+{
+ "name":"org.jline.terminal.impl.exec.ExecTerminalProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.jline.terminal.impl.ffm.FfmTerminalProvider"
+},
+{
+ "name":"org.jline.terminal.impl.jansi.JansiTerminalProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.jline.terminal.impl.jna.JnaTerminalProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.jline.terminal.impl.jni.JniTerminalProvider",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"org.osgi.framework.BundleEvent"
+},
+{
+ "name":"picocli.AutoComplete$GenerateCompletion",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true,
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"picocli.CommandLine$AutoHelpMixin",
+ "allDeclaredFields":true,
+ "queryAllDeclaredMethods":true
+},
+{
+ "name":"scala.util.Properties"
+},
+{
+ "name":"shaded.parquet.com.fasterxml.jackson.databind.ext.Java7SupportImpl",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.misc.Signal",
+ "methods":[{"name":"","parameterTypes":["java.lang.String"] }, {"name":"handle","parameterTypes":["sun.misc.Signal","sun.misc.SignalHandler"] }]
+},
+{
+ "name":"sun.misc.SignalHandler",
+ "fields":[{"name":"SIG_DFL"}]
+},
+{
+ "name":"sun.misc.Unsafe",
+ "allDeclaredFields":true,
+ "methods":[{"name":"invokeCleaner","parameterTypes":["java.nio.ByteBuffer"] }]
+},
+{
+ "name":"sun.security.pkcs12.PKCS12KeyStore",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.pkcs12.PKCS12KeyStore$DualFormatPKCS12",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.DSA$SHA224withDSA",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.DSA$SHA256withDSA",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.JavaKeyStore$DualFormatJKS",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.JavaKeyStore$JKS",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.MD5",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.NativePRNG",
+ "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["java.security.SecureRandomParameters"] }]
+},
+{
+ "name":"sun.security.provider.SHA",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.SHA2$SHA224",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.SHA2$SHA256",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.SHA5$SHA384",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.SHA5$SHA512",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.X509Factory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.provider.certpath.PKIXCertPathValidator",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.rsa.PSSParameters",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.rsa.RSAKeyFactory$Legacy",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.rsa.RSAPSSSignature",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.rsa.RSASignature$SHA224withRSA",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.rsa.RSASignature$SHA256withRSA",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.ssl.KeyManagerFactoryImpl$SunX509",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.ssl.SSLContextImpl$DefaultSSLContext",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.ssl.SSLContextImpl$TLSContext",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.ssl.TrustManagerFactoryImpl$PKIXFactory",
+ "methods":[{"name":"","parameterTypes":[] }]
+},
+{
+ "name":"sun.security.util.ObjectIdentifier"
+},
+{
+ "name":"sun.security.x509.AuthorityInfoAccessExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.AuthorityKeyIdentifierExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.BasicConstraintsExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.CRLDistributionPointsExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.CertificateExtensions"
+},
+{
+ "name":"sun.security.x509.CertificatePoliciesExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.ExtendedKeyUsageExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.IssuerAlternativeNameExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.KeyUsageExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.NetscapeCertTypeExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.PrivateKeyUsageExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.SubjectAlternativeNameExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+},
+{
+ "name":"sun.security.x509.SubjectKeyIdentifierExtension",
+ "methods":[{"name":"","parameterTypes":["java.lang.Boolean","java.lang.Object"] }]
+}
+]
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/resource-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/resource-config.json
new file mode 100644
index 00000000..ad082462
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/resource-config.json
@@ -0,0 +1,115 @@
+{
+ "resources":{
+ "includes":[{
+ "pattern":"\\QMETA-INF/maven/org.jline/jline-native/pom.properties\\E"
+ }, {
+ "pattern":"\\QMETA-INF/maven/org.xerial.snappy/snappy-java/pom.properties\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/ch.qos.logback.classic.spi.Configurator\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.lang.System$LoggerFinder\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.net.spi.InetAddressResolverProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.net.spi.URLStreamHandlerProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.nio.channels.spi.SelectorProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.nio.charset.spi.CharsetProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/java.time.zone.ZoneRulesProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/javax.xml.parsers.SAXParserFactory\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/javax.xml.stream.XMLInputFactory\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org.apache.avro.Conversion\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org.apache.avro.LogicalTypes$LogicalTypeFactory\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org.apache.commons.logging.LogFactory\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org.slf4j.spi.SLF4JServiceProvider\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org/jline/terminal/provider/exec\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org/jline/terminal/provider/ffm\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org/jline/terminal/provider/jansi\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org/jline/terminal/provider/jna\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/org/jline/terminal/provider/jni\\E"
+ }, {
+ "pattern":"\\QMETA-INF/services/software.amazon.awssdk.http.SdkHttpService\\E"
+ }, {
+ "pattern":"\\Qcommons-logging.properties\\E"
+ }, {
+ "pattern":"\\Qcore-default.xml\\E"
+ }, {
+ "pattern":"\\Qcore-site.xml\\E"
+ }, {
+ "pattern":"\\Qhadoop-site.xml\\E"
+ }, {
+ "pattern":"\\Qiceberg-build.properties\\E"
+ }, {
+ "pattern":"\\Qlinux/aarch64/libzstd-jni-1.5.6-6.so\\E"
+ }, {
+ "pattern":"\\Qlinux/amd64/libzstd-jni-1.5.6-6.so\\E"
+ }, {
+ "pattern":"\\Qlogback-test.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback-test.xml\\E"
+ }, {
+ "pattern":"\\Qlogback.scmo\\E"
+ }, {
+ "pattern":"\\Qlogback.xml\\E"
+ }, {
+ "pattern":"\\Qmapred-default.xml\\E"
+ }, {
+ "pattern":"\\Qmapred-site.xml\\E"
+ }, {
+ "pattern":"\\Qmozilla/public-suffix-list.txt\\E"
+ }, {
+ "pattern":"\\Qorg-xerial-snappy.properties\\E"
+ }, {
+ "pattern":"\\Qorg/apache/hc/client5/version.properties\\E"
+ }, {
+ "pattern":"\\Qorg/jline/nativ/Linux/aarch64/libjlinenative.so\\E"
+ }, {
+ "pattern":"\\Qorg/jline/nativ/Linux/x86_64/libjlinenative.so\\E"
+ }, {
+ "pattern":"\\Qorg/jline/utils/capabilities.txt\\E"
+ }, {
+ "pattern":"\\Qorg/jline/utils/xterm-256color.caps\\E"
+ }, {
+ "pattern":"\\Qorg/publicsuffix/list/effective_tld_names.dat\\E"
+ }, {
+ "pattern":"\\Qorg/xerial/snappy/VERSION\\E"
+ }, {
+ "pattern":"\\Qorg/xerial/snappy/native/Linux/aarch64/libsnappyjava.so\\E"
+ }, {
+ "pattern":"\\Qorg/xerial/snappy/native/Linux/x86_64/libsnappyjava.so\\E"
+ }, {
+ "pattern":"\\Qsoftware/amazon/awssdk/core/util/mime.types\\E"
+ }, {
+ "pattern":"\\Qsoftware/amazon/awssdk/global/handlers/execution.interceptors\\E"
+ }, {
+ "pattern":"\\Qsoftware/amazon/awssdk/global/partitions.json\\E"
+ }, {
+ "pattern":"\\Qsoftware/amazon/awssdk/services/s3/execution.interceptors\\E"
+ }, {
+ "pattern":"\\Qyarn-default.xml\\E"
+ }, {
+ "pattern":"\\Qyarn-site.xml\\E"
+ }, {
+ "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/nfkc.nrm\\E"
+ }, {
+ "pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt72b/uprops.icu\\E"
+ }, {
+ "pattern":"java.base:\\Qsun/net/idn/uidna.spp\\E"
+ }, {
+ "pattern":"java.base:\\Qsun/text/resources/LineBreakIteratorData\\E"
+ }]},
+ "bundles":[]
+}
diff --git a/ice/src/main/resources/META-INF/native-image/com.altinity/ice/serialization-config.json b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/serialization-config.json
new file mode 100644
index 00000000..f3d7e06e
--- /dev/null
+++ b/ice/src/main/resources/META-INF/native-image/com.altinity/ice/serialization-config.json
@@ -0,0 +1,8 @@
+{
+ "types":[
+ ],
+ "lambdaCapturingTypes":[
+ ],
+ "proxies":[
+ ]
+}