| {"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"Home","text":""},{"location":"#apache-icebergtm-c","title":"Apache Iceberg\u2122 C++","text":""},{"location":"#overview","title":"Overview","text":"<p>iceberg-cpp is a C++ implementation of Apache Iceberg\u2122, an open table format for large analytic datasets. It provides the data structures, algorithms, and catalog integrations required to read, write, and manage Iceberg tables from C++ applications or engines.</p>"},{"location":"#key-features","title":"Key Features","text":"<ul> <li>Modern C++23 \u2014 Built with ranges, concepts, <code>std::expected</code>, and other modern idioms</li> <li>Cross-Platform \u2014 Builds and runs on Linux, macOS, and Windows</li> <li>Spec Compliance \u2014 Full table spec support today; Puffin, View, and UDF specs are on the roadmap</li> <li>Arrow-Native \u2014 Uses the Arrow C Data Interface as the primary data API</li> <li>Easy Engine Integration \u2014 Interface-oriented, pluggable design for Catalog, FileIO, FileFormat, and more</li> <li>Battery-Included \u2014 Deep integration with Apache Arrow for columnar layout and rich file system support</li> <li>REST Catalog Client \u2014 Connects to any Iceberg REST catalog with pluggable authentication</li> <li>File Format Support \u2014 Built-in readers and writers for Apache Parquet and Apache Avro</li> </ul>"},{"location":"#quick-links","title":"Quick Links","text":"<ul> <li>Getting Started \u2014 Build and install the library</li> <li>Contributing \u2014 Development setup and coding standards</li> <li>Releases \u2014 Download and release history</li> <li>API Documentation \u2014 Doxygen-generated API reference</li> </ul>"},{"location":"#community","title":"Community","text":"<ul> <li>Slack #cpp channel</li> <li>Dev mailing list (subscribe / archives)</li> <li>GitHub Issues</li> </ul>"},{"location":"#license","title":"License","text":"<p>Licensed under the Apache License, Version 2.0.</p>"},{"location":"contributing/","title":"Contributing","text":""},{"location":"contributing/#contributing","title":"Contributing","text":"<p>We welcome contributions to Apache Iceberg C++. For general Iceberg contribution guidelines, see the official guide. Contributors using AI-assisted tools must follow the AI-assisted contribution guidelines.</p> <p>For build and installation instructions, see Getting Started.</p>"},{"location":"contributing/#coding-standard","title":"Coding Standard","text":"<p>The project follows the same coding standard as Apache Arrow (a variant of the Google\u2019s C++ Style Guide)</p>"},{"location":"contributing/#naming-conventions","title":"Naming Conventions","text":"Element Style Examples Classes / Structs <code>PascalCase</code> <code>TableScanBuilder</code>, <code>PartitionSpec</code> Factory methods <code>PascalCase</code> <code>CreateNamespace()</code>, <code>ExtractYear()</code> Accessors / Getters <code>snake_case</code> <code>name()</code>, <code>type_id()</code>, <code>partition_spec()</code> Variables <code>snake_case</code> <code>file_io</code>, <code>schema_id</code> Constants <code>k</code> + <code>PascalCase</code> <code>kHeaderContentType</code>, <code>kMaxPrecision</code>"},{"location":"contributing/#general-practices","title":"General Practices","text":"<ul> <li>Prefer smart pointers (<code>std::unique_ptr</code>, <code>std::shared_ptr</code>) for memory management</li> <li>Use <code>Result<T></code> for error propagation</li> <li>Write Doxygen-style comments (<code>/// \\brief ...</code>) for all public APIs</li> <li>Do not remove public methods without a deprecation cycle:</li> </ul> <pre><code>[[deprecated(\"Use new_method() instead. Will be removed in a future release.\")]]\nvoid old_method();\n</code></pre>"},{"location":"contributing/#development-environment","title":"Development Environment","text":""},{"location":"contributing/#code-formatting","title":"Code Formatting","text":"<p>Formatting is enforced via <code>.clang-format</code> (Google base, <code>ColumnLimit: 90</code>). Set up <code>pre-commit</code> to run it automatically:</p> <pre><code>pip install pre-commit\npre-commit install\n</code></pre> <p>To run all hooks manually on the entire codebase:</p> <pre><code>pre-commit run -a\n</code></pre>"},{"location":"contributing/#dev-containers","title":"Dev Containers","text":"<p>We provide Dev Container templates for VS Code:</p> <pre><code>cd .devcontainer\ncp Dockerfile.template Dockerfile\ncp devcontainer.json.template devcontainer.json\n</code></pre> <p>Then select <code>Dev Containers: Reopen in Container</code> from the Command Palette.</p>"},{"location":"contributing/#submitting-changes","title":"Submitting Changes","text":""},{"location":"contributing/#workflow","title":"Workflow","text":"<ol> <li>Fork the repository on GitHub</li> <li>Create a feature branch from <code>main</code>: <pre><code>git checkout -b feature/your-feature-name\n</code></pre></li> <li>Make your changes following the coding standards</li> <li>Add or update tests for any behavioral changes</li> <li>Ensure all tests pass and <code>pre-commit run -a</code> is clean</li> <li>Push to your fork and open a Pull Request</li> </ol>"},{"location":"contributing/#commit-messages","title":"Commit Messages","text":"<p>Follow Conventional Commits:</p> <pre><code>feat: add support for S3 file system\nfix: resolve memory leak in table reader\ndocs: update API documentation\ntest: add unit tests for schema validation\nrefactor(rest): simplify auth token handling\n</code></pre>"},{"location":"contributing/#pull-request-checklist","title":"Pull Request Checklist","text":"<ul> <li>Clear problem/solution description</li> <li>Linked issue(s) when applicable</li> <li>Tests for behavioral changes</li> <li>Passing CI checks (tests, pre-commit, license header, sanitizers)</li> </ul>"},{"location":"contributing/#getting-help","title":"Getting Help","text":"<ul> <li>GitHub Issues \u2014 Report bugs or request features</li> <li>Good First Issues \u2014 Browse here</li> <li>Mailing List \u2014 dev@iceberg.apache.org (subscribe / unsubscribe / archives)</li> <li>Slack \u2014 #cpp channel</li> </ul> <p>The Apache Iceberg community follows the Apache Way and the Apache Foundation Code of Conduct.</p>"},{"location":"file-io/","title":"FileIO","text":""},{"location":"file-io/#fileio","title":"FileIO","text":"<p><code>FileIO</code> reads, writes, and deletes Iceberg data and metadata files.</p>"},{"location":"file-io/#built-in-implementations","title":"Built-in implementations","text":"<p>Call <code>iceberg::arrow::RegisterAll()</code> to register the Arrow-backed FileIO implementations:</p> Registry name Schemes <code>arrow-fs-local</code> paths without a scheme, <code>file</code> <code>arrow-fs-s3</code> <code>s3</code>, <code>s3a</code>, <code>s3n</code>, <code>oss</code> <p>The S3 implementation requires Arrow S3 support.</p>"},{"location":"file-io/#select-an-implementation","title":"Select an implementation","text":"<p>Load a registered implementation directly:</p> <pre><code>#include \"iceberg/arrow/arrow_register.h\"\n#include \"iceberg/arrow/s3/s3_properties.h\"\n#include \"iceberg/file_io_registry.h\"\n#include \"iceberg/resolving_file_io.h\"\n\niceberg::arrow::RegisterAll();\n\nauto file_io = iceberg::FileIORegistry::Load(\n iceberg::FileIORegistry::kArrowS3FileIO,\n {{std::string(iceberg::arrow::S3Properties::kEndpoint),\n \"https://s3.example.com\"},\n {std::string(iceberg::arrow::S3Properties::kClientRegion), \"us-east-1\"}});\n</code></pre> <p>For a REST catalog, set <code>io-impl</code> to the registry name. If it is omitted, the REST catalog uses <code>ResolvingFileIO</code> and selects a registered implementation for each file location's scheme.</p>"},{"location":"file-io/#configure-s3","title":"Configure S3","text":"Key Example Description <code>s3.access-key-id</code> <code>admin</code> Static access key ID; must be set together with the secret key <code>s3.secret-access-key</code> <code>password</code> Static secret access key <code>s3.session-token</code> <code>AQoDYXdzEJr...</code> Session token, for temporary credentials. Ignored unless both static keys are set <code>client.region</code> <code>us-east-1</code> Region to sign requests for <code>s3.endpoint</code> <code>https://127.0.0.1:9000</code> Endpoint to use instead of the AWS one. When absent, the <code>AWS_ENDPOINT_URL_S3</code> / <code>AWS_ENDPOINT_URL</code> environment variables are consulted <code>s3.path-style-access</code> <code>true</code> Address buckets as a path (<code>endpoint/bucket</code>) instead of a virtual host (<code>bucket.endpoint</code>). Only takes effect together with a custom endpoint <p>The following keys are specific to iceberg-cpp; they are not part of the Java Iceberg or REST specification property set:</p> Key Example Description <code>s3.ssl.enabled</code> <code>true</code> Scheme to use for the endpoint, overriding the one it carries <code>s3.connect-timeout-ms</code> <code>1000</code> Connection timeout <code>s3.socket-timeout-ms</code> <code>5000</code> Request timeout. Ignored outside Windows and macOS <p>Without credentials, the AWS default credential chain is used, which covers environment variables, the shared configuration file, and the various role and identity providers.</p>"},{"location":"file-io/#s3-compatible-storage","title":"S3-compatible storage","text":"<p>Stores that speak the S3 API are served by the same implementation. The scheme selects it; <code>s3.endpoint</code> decides where requests actually go. A location keeps its own scheme and is canonicalized internally, so a credential vended for the <code>s3</code> prefix applies to it.</p> <p>For Alibaba Cloud OSS, point <code>s3.endpoint</code> at the S3-compatible endpoint of the bucket's region and set <code>s3.path-style-access</code> to <code>false</code>: with a custom endpoint, buckets are addressed as a path unless told otherwise, and the service rejects that with <code>SecondLevelDomainForbidden: Please use virtual hosted style to access</code>:</p> <pre><code>auto file_io = iceberg::FileIORegistry::Load(\n iceberg::FileIORegistry::kArrowS3FileIO,\n {{std::string(iceberg::arrow::S3Properties::kEndpoint),\n \"https://s3.oss-cn-hangzhou.aliyuncs.com\"},\n {std::string(iceberg::arrow::S3Properties::kClientRegion), \"cn-hangzhou\"},\n {std::string(iceberg::arrow::S3Properties::kPathStyleAccess), \"false\"}});\n\nfile_io.value()->NewInputFile(\"oss://bucket/path/to/file.parquet\");\n</code></pre>"},{"location":"file-io/#register-a-custom-fileio","title":"Register a custom FileIO","text":"<p>Register the factory before creating the catalog or resolver:</p> <pre><code>#include <string_view>\n\niceberg::FileIORegistry::Register(\n \"my-file-io\",\n {.create = [](const iceberg::FileIORegistry::Properties& properties)\n -> iceberg::Result<std::unique_ptr<iceberg::FileIO>> {\n return MakeMyFileIO(properties);\n },\n .accepts = [](std::string_view scheme) { return scheme == \"myfs\"; }});\n</code></pre> <p><code>create</code> is required. Set <code>accepts</code> to enable automatic selection; it receives the normalized lower-case scheme. Leave it empty for an implementation selected only by <code>io-impl</code>.</p> <pre><code>iceberg::FileIORegistry::Load(\"my-file-io\", {});\nauto file_io = std::make_unique<iceberg::ResolvingFileIO>(\n iceberg::FileIORegistry::Properties{});\nfile_io->NewInputFile(\"myfs://bucket/path/file.parquet\");\n</code></pre> <p>Registrations are process-wide and must be completed before creating catalogs or resolvers. When multiple implementations accept the same scheme, the last registration takes precedence. <code>ResolvingFileIO</code> lazily creates and reuses one FileIO instance per registry name.</p>"},{"location":"file-io/#storage-credentials","title":"Storage credentials","text":"<p>When a REST catalog returns vended storage credentials for a table, it applies them to the table's FileIO. A custom FileIO selected through <code>io-impl</code> must implement <code>SupportsStorageCredentials</code>; otherwise table access with vended credentials is unsupported. With automatic resolution, <code>ResolvingFileIO</code> forwards credentials to registered delegates that support them.</p>"},{"location":"getting-started/","title":"Getting Started","text":""},{"location":"getting-started/#getting-started","title":"Getting Started","text":""},{"location":"getting-started/#requirements","title":"Requirements","text":"<p>Required:</p> <ul> <li>C++23 compliant compiler (GCC 14+, Clang 18+, MSVC 2022+)</li> <li>CMake 3.25+</li> <li>Ninja (recommended build backend)</li> </ul>"},{"location":"getting-started/#quick-start","title":"Quick Start","text":"<pre><code>git clone https://github.com/apache/iceberg-cpp.git\ncd iceberg-cpp\ncmake -S . -B build -G Ninja\ncmake --build build\nctest --test-dir build --output-on-failure\n</code></pre>"},{"location":"getting-started/#build-with-cmake","title":"Build with CMake","text":""},{"location":"getting-started/#core-libraries","title":"Core Libraries","text":"<pre><code>cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_BUILD_STATIC=ON -DICEBERG_BUILD_SHARED=ON\ncmake --build build\nctest --test-dir build --output-on-failure\ncmake --install build\n</code></pre>"},{"location":"getting-started/#bundle-library-with-vendored-dependencies","title":"Bundle Library (with vendored dependencies)","text":"<pre><code>cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_BUILD_BUNDLE=ON\ncmake --build build\ncmake --install build\n</code></pre>"},{"location":"getting-started/#bundle-library-with-provided-apache-arrow","title":"Bundle Library (with provided Apache Arrow)","text":"<pre><code>cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DCMAKE_PREFIX_PATH=/path/to/arrow -DICEBERG_BUILD_BUNDLE=ON\ncmake --build build\ncmake --install build\n</code></pre>"},{"location":"getting-started/#cmake-build-options","title":"CMake Build Options","text":"Option Default Description <code>ICEBERG_BUILD_STATIC</code> <code>ON</code> Build static library <code>ICEBERG_BUILD_SHARED</code> <code>OFF</code> Build shared library <code>ICEBERG_BUILD_TESTS</code> <code>ON</code> Build tests <code>ICEBERG_BUILD_BUNDLE</code> <code>ON</code> Build the battery-included library <code>ICEBERG_BUILD_REST</code> <code>ON</code> Build REST catalog client <code>ICEBERG_BUILD_REST_INTEGRATION_TESTS</code> <code>OFF</code> Build REST catalog integration tests <code>ICEBERG_BUILD_HIVE</code> <code>OFF</code> Build Hive (HMS) catalog client <code>ICEBERG_BUILD_SQL_CATALOG</code> <code>OFF</code> Build SQL catalog client <code>ICEBERG_SQL_SQLITE</code> <code>OFF</code> Build the SQLite connector for the SQL catalog <code>ICEBERG_SQL_POSTGRESQL</code> <code>OFF</code> Build the PostgreSQL connector for the SQL catalog <code>ICEBERG_SQL_MYSQL</code> <code>OFF</code> Build the MySQL connector for the SQL catalog <code>ICEBERG_ENABLE_ASAN</code> <code>OFF</code> Enable Address Sanitizer <code>ICEBERG_ENABLE_UBSAN</code> <code>OFF</code> Enable Undefined Behavior Sanitizer"},{"location":"getting-started/#running-tests","title":"Running Tests","text":"<p>Run all tests:</p> <pre><code>ctest --test-dir build --output-on-failure\n</code></pre> <p>Run a specific test suite:</p> <pre><code>ctest --test-dir build -R schema_test --output-on-failure\n</code></pre>"},{"location":"getting-started/#build-examples","title":"Build Examples","text":"<p>After installing the core libraries:</p> <pre><code>cd example\ncmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH=/path/to/install\ncmake --build build\n</code></pre> <p>If using provided Apache Arrow, include both paths:</p> <pre><code>cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH=\"/path/to/install;/path/to/arrow\"\n</code></pre>"},{"location":"getting-started/#customizing-dependency-urls","title":"Customizing Dependency URLs","text":"<p>If you experience network issues when downloading dependencies, you can override the download URLs using environment variables:</p> Variable Dependency <code>ICEBERG_ARROW_URL</code> Apache Arrow tarball <code>ICEBERG_AVRO_URL</code> Apache Avro tarball <code>ICEBERG_AVRO_GIT_URL</code> Apache Avro git repository <code>ICEBERG_NANOARROW_URL</code> Nanoarrow tarball <code>ICEBERG_CROARING_URL</code> CRoaring tarball <code>ICEBERG_UTF8PROC_URL</code> utf8proc tarball <code>ICEBERG_NLOHMANN_JSON_URL</code> nlohmann-json tarball <code>ICEBERG_CPR_URL</code> cpr tarball <p>Example:</p> <pre><code>export ICEBERG_ARROW_URL=\"https://your-mirror.com/apache-arrow-22.0.0.tar.gz\"\ncmake -S . -B build -G Ninja\n</code></pre>"},{"location":"library/","title":"Library Design","text":""},{"location":"library/#library-design","title":"Library Design","text":"<p>Iceberg C++ splits its code into a few libraries so applications can link only what they need.</p>"},{"location":"library/#library-boundaries","title":"Library boundaries","text":""},{"location":"library/#iceberg","title":"<code>iceberg</code>","text":"<p>The core library contains schemas, table metadata, manifests, snapshots, table updates, catalog interfaces, Puffin files, etc. It also owns the Arrow C Data interface and the nanoarrow-based utilities used by core metadata and data processing code. These utilities do not depend on the Arrow C++ library.</p>"},{"location":"library/#iceberg_data","title":"<code>iceberg_data</code>","text":"<p>This library handles data-plane processing, including delete filtering, data writers, and scan task readers. Concrete Avro and Parquet readers and writers are supplied by the <code>iceberg_bundle</code> library.</p>"},{"location":"library/#iceberg_bundle","title":"<code>iceberg_bundle</code>","text":"<p>This library combines <code>iceberg_data</code> with the Arrow C++, Avro, Parquet, and Arrow filesystem integrations. It gives applications one link-time dependency.</p>"},{"location":"library/#iceberg_rest-iceberg_hive-iceberg_sql_catalog","title":"<code>iceberg_rest</code>, <code>iceberg_hive</code>, <code>iceberg_sql_catalog</code>","text":"<p>These optional catalog libraries cover REST, Hive Metastore, and SQL databases. Each depends on <code>iceberg</code> and its own client libraries, not on <code>iceberg_data</code> or <code>iceberg_bundle</code>.</p>"},{"location":"library/#source-and-header-ownership","title":"Source and header ownership","text":"<p>Production files are kept in the directory for the library that builds them:</p> <ul> <li>Core files stay in the <code>iceberg</code> root or core subdirectories such as <code>deletes/</code>, <code>puffin/</code>, <code>manifest/</code>, and <code>update/</code>.</li> <li>Files under <code>data/</code> are built into <code>iceberg_data</code>.</li> <li>Files under <code>arrow/</code>, <code>avro/</code>, and <code>parquet/</code> are built into <code>iceberg_bundle</code>.</li> <li>Optional catalog implementations stay under <code>catalog/rest/</code>, <code>catalog/hive/</code>, and <code>catalog/sql/</code> and are built into their corresponding catalog libraries.</li> </ul> <p>The Arrow C Data files in the <code>iceberg</code> root are core infrastructure and are separate from the Arrow C++ integration under <code>arrow/</code>.</p> <p>Public headers are installed with their existing <code>iceberg/...</code> include paths. Headers whose names contain <code>internal</code> are not installed.</p>"},{"location":"library/#runtime-registration","title":"Runtime registration","text":"<p>The core library defines registries for optional file readers, writers, and filesystem implementations. Integrations register their implementations as follows:</p> <ul> <li>Arrow local and S3 <code>FileIO</code> implementations are registered when the Arrow integration is loaded. <code>iceberg::arrow::RegisterAll()</code> additionally registers Arrow-based batch projection.</li> <li>Avro readers, writers, and logical types are registered by <code>iceberg::avro::RegisterAll()</code>.</li> <li>Parquet readers and writers are registered by <code>iceberg::parquet::RegisterAll()</code>.</li> </ul>"},{"location":"release-process/","title":"Release Process","text":""},{"location":"release-process/#release-process","title":"Release Process","text":"<p>This guide is for Apache Iceberg committers and PMC members who are managing a release.</p>"},{"location":"release-process/#overview","title":"Overview","text":"<ol> <li>Test the revision to be released</li> <li>Prepare a release candidate (RC) and start a vote</li> <li>Publish the release after the vote passes</li> </ol>"},{"location":"release-process/#prerequisites","title":"Prerequisites","text":"<ul> <li>You must be an Apache Iceberg committer or PMC member</li> <li>Required tools: <code>git</code>, <code>gh</code> (GitHub CLI), <code>gpg</code>, <code>svn</code></li> <li>A PGP key for signing (see Apache release signing guide)</li> </ul>"},{"location":"release-process/#setting-up-your-pgp-key","title":"Setting Up Your PGP Key","text":"<p>Your PGP key must be published in the KEYS file. For first-time release managers:</p> <pre><code># Check out the release distribution directory\nsvn co https://dist.apache.org/repos/dist/release/iceberg\ncd iceberg\n\n# Append your GPG public key\necho \"\" >> KEYS\ngpg --list-sigs <YOUR_KEY_ID> >> KEYS\ngpg --armor --export <YOUR_KEY_ID> >> KEYS\nsvn commit -m \"Add GPG key for <YOUR_NAME>\"\n</code></pre>"},{"location":"release-process/#step-1-prepare-rc-and-vote","title":"Step 1: Prepare RC and Vote","text":"<p>Run <code>release_rc.sh</code> on a working copy of <code>apache/iceberg-cpp</code> (not your fork):</p> <pre><code>git clone git@github.com:apache/iceberg-cpp.git && cd iceberg-cpp\nGH_TOKEN=${YOUR_GITHUB_TOKEN} dev/release/release_rc.sh ${VERSION} ${RC}\n</code></pre> <p>For example, to release RC0 of version 0.3.0:</p> <pre><code>GH_TOKEN=${YOUR_GITHUB_TOKEN} dev/release/release_rc.sh 0.3.0 0\n</code></pre> <p>The script will:</p> <ol> <li>Tag the release candidate (e.g., <code>v0.3.0-rc0</code>)</li> <li>Wait for the GitHub Actions RC workflow to build the source tarball</li> <li>Download and sign the tarball</li> <li>Upload to ASF's dev distribution</li> <li>Print a draft vote email for <code>dev@iceberg.apache.org</code></li> </ol> <p>If an RC has problems, increment the RC number (RC1, RC2, etc.) and repeat.</p>"},{"location":"release-process/#step-2-publish","title":"Step 2: Publish","text":"<p>After the vote passes (requires 72 hours and at least 3 binding +1 votes), publish the release:</p> <pre><code>GH_TOKEN=${YOUR_GITHUB_TOKEN} dev/release/release.sh ${VERSION} ${RC}\n</code></pre> <p>The script will:</p> <ol> <li>Create the final release tag (e.g., <code>v0.3.0</code>)</li> <li>Move the RC artifacts from dev to release distribution</li> <li>Create a GitHub Release with the source tarball and signatures</li> <li>Clean up old releases from the distribution directory</li> <li>Print a draft announcement email</li> </ol> <p>After running the script, add the release to ASF's report database.</p>"},{"location":"releases/","title":"Release History","text":""},{"location":"releases/#release-history","title":"Release History","text":"Version Date Links 0.3.0 June 14, 2026 Release Notes \u00b7 Source \u00b7 Blog Post 0.2.0 January 26, 2026 Release Notes \u00b7 Source \u00b7 Blog Post 0.1.0 September 10, 2025 Release Notes \u00b7 Source <p>For the full changelog of each release, see the GitHub Releases page.</p>"},{"location":"releases/#030","title":"0.3.0","text":"<ul> <li>Extend table scan planning with v2 delete support, manifest filtering, and projection</li> <li>Incremental scan planning with append-only and basic changelog scan support</li> <li>REST catalog improvements including initial OAuth2 support with auto-refresh, basic authentication, snapshot loading mode, namespace separators, and server-side scan planning</li> <li>New table metadata update including partition statistics, schema update, and expire snapshots with file cleanup support</li> <li>Transaction with retry, and scaffolding work on MergingSnapshotUpdate for update, delete, overwrite, etc.</li> <li>SQL catalog support backed by SQLite, PostgreSQL, and MySQL stores</li> <li>File scan task reader with v2 deletes support</li> <li>V2 data writer support and writer metrics collection</li> <li>Groundwork for scan and commit metrics reporting</li> <li>Puffin metadata and reader/writer support</li> <li>Initial v3 support with the unknown and nanosecond timestamp types</li> <li>FileIO enrichment including new InputFile and OutputFile interfaces, bulk delete and S3 integration</li> </ul>"},{"location":"releases/#020","title":"0.2.0","text":"<ul> <li>Table scan planning with V2 delete and filtering support</li> <li>Append table support</li> <li>Schema evolution and table metadata update operations</li> <li>Transaction API with snapshot management</li> <li>REST catalog client with namespace and table CRUD</li> <li>Expression system with metrics and residual evaluators</li> <li>Meson build system support</li> </ul>"},{"location":"releases/#010","title":"0.1.0","text":"<ul> <li>Core data types, schema, and table metadata (JSON serde)</li> <li>Partition specs, sort orders, and snapshot management</li> <li>Basic table scan planning (w/o deletes)</li> <li>Avro and Parquet file format support</li> <li>Local file I/O via Arrow FileSystem</li> <li>In-memory catalog</li> </ul>"},{"location":"sql-catalog/","title":"SQL Catalog","text":""},{"location":"sql-catalog/#sql-catalog","title":"SQL Catalog","text":"<p><code>SqlCatalog</code> implements the Iceberg <code>Catalog</code> API on top of a relational database. Its schema is compatible with the Apache Iceberg Java <code>JdbcCatalog</code> and stores catalog rows in <code>iceberg_tables</code> and <code>iceberg_namespace_properties</code>.</p>"},{"location":"sql-catalog/#build","title":"Build","text":"<p>Enable the catalog at configure time:</p> <pre><code>cmake -S . -B build -DICEBERG_BUILD_SQL_CATALOG=ON\n</code></pre> <p>Built-in connectors are optional:</p> CMake option Default Native dependency <code>ICEBERG_SQL_SQLITE</code> <code>OFF</code> SQLite3 <code>ICEBERG_SQL_POSTGRESQL</code> <code>OFF</code> libpq <code>ICEBERG_SQL_MYSQL</code> <code>OFF</code> libmysqlclient <p>The built-in connectors use sqlpp23, which is fetched by CMake when a connector is enabled. Projects can also supply their own <code>CatalogStore</code> implementation and disable all built-in connectors.</p>"},{"location":"sql-catalog/#usage","title":"Usage","text":"<pre><code>#include \"iceberg/catalog/sql/sql_catalog.h\"\n\nusing iceberg::sql::SqlCatalog;\nusing iceberg::sql::SqlCatalogConfig;\n\nSqlCatalogConfig config{\n .name = \"prod\",\n .uri = \"/var/lib/iceberg/catalog.db\",\n .warehouse_location = \"s3://my-bucket/warehouse\",\n};\n\nauto catalog = SqlCatalog::MakeSqliteCatalog(config, file_io).value();\n</code></pre> <p>Connector factories are always declared in the public headers. If a connector was not built, its factory returns <code>ErrorKind::kNotSupported</code>.</p>"},{"location":"verify-rc/","title":"Verify a Release Candidate","text":""},{"location":"verify-rc/#verify-a-release-candidate","title":"Verify a Release Candidate","text":"<p>When a release candidate (RC) is published for a vote, community members are encouraged to verify it before casting their vote.</p>"},{"location":"verify-rc/#prerequisites","title":"Prerequisites","text":"<ul> <li><code>curl</code></li> <li><code>gpg</code></li> <li><code>shasum</code> or <code>sha512sum</code></li> <li><code>tar</code></li> <li>CMake 3.25+</li> <li>C++23 compliant compiler (GCC 14+, Clang 18+, MSVC 2022+)</li> </ul>"},{"location":"verify-rc/#verification-steps","title":"Verification Steps","text":"<p>We provide a script that automates the entire verification process:</p> <pre><code>dev/release/verify_rc.sh ${VERSION} ${RC}\n</code></pre> <p>For example, to verify RC0 of version 0.3.0:</p> <pre><code>dev/release/verify_rc.sh 0.3.0 0\n</code></pre> <p>The script performs the following checks:</p> <ol> <li>Downloads the source tarball from ASF's dev distribution</li> <li>Imports the KEYS file and verifies the GPG signature</li> <li>Verifies the SHA-512 checksum</li> <li>Extracts the source and builds with CMake</li> <li>Runs the full test suite</li> </ol> <p>If everything passes, you will see:</p> <pre><code>RC looks good!\n</code></pre>"},{"location":"verify-rc/#manual-verification","title":"Manual Verification","text":"<p>If you prefer to verify manually:</p>"},{"location":"verify-rc/#1-download-the-rc","title":"1. Download the RC","text":"<pre><code>VERSION=0.3.0\nRC=0\nBASE_URL=\"https://dist.apache.org/repos/dist/dev/iceberg/apache-iceberg-cpp-${VERSION}-rc${RC}\"\n\ncurl -O \"${BASE_URL}/apache-iceberg-cpp-${VERSION}.tar.gz\"\ncurl -O \"${BASE_URL}/apache-iceberg-cpp-${VERSION}.tar.gz.asc\"\ncurl -O \"${BASE_URL}/apache-iceberg-cpp-${VERSION}.tar.gz.sha512\"\n</code></pre>"},{"location":"verify-rc/#2-verify-signature-and-checksum","title":"2. Verify Signature and Checksum","text":"<pre><code># Import KEYS\ncurl https://downloads.apache.org/iceberg/KEYS | gpg --import\n\n# Verify GPG signature\ngpg --verify apache-iceberg-cpp-${VERSION}.tar.gz.asc apache-iceberg-cpp-${VERSION}.tar.gz\n\n# Verify SHA-512 checksum\nshasum -a 512 -c apache-iceberg-cpp-${VERSION}.tar.gz.sha512\n</code></pre>"},{"location":"verify-rc/#3-build-and-test","title":"3. Build and Test","text":"<pre><code>tar xf apache-iceberg-cpp-${VERSION}.tar.gz\ncd apache-iceberg-cpp-${VERSION}\n\ncmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DICEBERG_BUILD_STATIC=ON -DICEBERG_BUILD_SHARED=ON\ncmake --build build\nctest --test-dir build --output-on-failure\n</code></pre>"}]} |