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":[ + ] +}