pg_lake_engine

Query engine for data lake queries

Overview

PackageVersionCategoryLicenseLanguage
pg_lake3.4OLAPApache-2.0C
IDExtensionBinLibLoadCreateTrustRelocSchema
2560pg_lakeYesYesYesYesNoNolake
2561pg_extension_baseNoYesYesYesNoNoextension_base
2562pg_extension_updaterNoYesYesYesNoNoextension_updater
2563pg_mapNoYesNoYesNoNomap_type
2564pg_lake_engineNoYesYesYesNoNo__lake__internal__nsp__
2565pg_lake_icebergNoYesNoYesNoNolake_iceberg
2566pg_lake_tableNoYesYesYesNoNo__pg_lake_table_writes
2567pg_lake_copyNoYesYesYesNoNopg_catalog
Relatedpg_extension_base pg_map pg_duckdb pg_ducklake pg_mooncake duckdb_fdw pg_parquet pg_clickhouse columnar storage_engine orioledb
Depended Bypg_lake_copy pg_lake_iceberg pg_lake_table

Query-engine component. pg_extension_base auto-loads its module; delegated DuckDB execution additionally requires the separately running PG-major pgduck_server. Extension SQL/control version is 3.4; source and DEB/RPM package version is 3.4.0.

Version

TypeRepoVersionPG VerPackageDeps
EXTPIGSTY3.41817161514pg_lakepg_extension_base, pg_map
RPMPIGSTY3.4.01817161514pg_lake_$v-
DEBPIGSTY3.4.01817161514postgresql-$v-pg-lake-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64N/AN/AN/AN/AN/A
el8.aarch64N/AN/AN/AN/AN/A
el9.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
el9.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
el10.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
el10.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
d12.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
d12.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
d13.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
d13.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u22.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u22.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u24.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u24.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u26.x86_64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A
u26.aarch64PIGSTY 3.4.0PIGSTY 3.4.0PIGSTY 3.4.0N/AN/A

Build

You can build the RPM / DEB packages for pg_lake using pig build:

pig build pkg pg_lake         # build RPM / DEB packages

Install

You can install pg_lake directly. First, make sure the PGDG and PIGSTY repositories are added and enabled:

pig repo add pgsql -u          # Add repo and update cache

Install the extension using pig or apt/yum/dnf:

pig install pg_lake;          # Install for current active PG version
pig ext install -y pg_lake -v 18  # PG 18
pig ext install -y pg_lake -v 17  # PG 17
pig ext install -y pg_lake -v 16  # PG 16
dnf install -y pg_lake_18       # PG 18
dnf install -y pg_lake_17       # PG 17
dnf install -y pg_lake_16       # PG 16
apt install -y postgresql-18-pg-lake   # PG 18
apt install -y postgresql-17-pg-lake   # PG 17
apt install -y postgresql-16-pg-lake   # PG 16

Preload:

shared_preload_libraries = 'pg_extension_base';

Create Extension:

CREATE EXTENSION pg_lake_engine CASCADE;  -- requires: pg_extension_base, pg_map

Usage

Sources:

pg_lake_engine is the shared execution layer used by the pg_lake table, copy, and Iceberg extensions. It rewrites eligible PostgreSQL work for pgduck_server, maps PostgreSQL and DuckDB values, and tracks remote files that must be removed after aborts or table changes. It is an internal dependency rather than a standalone analytics interface.

Deployment Boundary

Install it through the top-level extension so its dependency graph and preload directives remain aligned:

shared_preload_libraries = 'pg_extension_base'
CREATE EXTENSION pg_lake CASCADE;

pg_lake_engine requires pg_extension_base and pg_map. Query execution also requires a running local pgduck_server; creating only this extension does not provide a usable lake table.

User-Visible Objects

  • Roles lake_read, lake_write, and lake_read_write: shared privilege groups consumed by the other components.
  • to_postgres(any): returns its input while forcing that expression to be evaluated in PostgreSQL instead of pushed to the lake engine.
  • to_date(double precision): converts a days-since-Unix-epoch value commonly found in Parquet to a PostgreSQL date.
  • lake_engine.deletion_queue: tracks committed orphan-file cleanup; readable by lake_write.
  • lake_engine.in_progress_files: tracks files produced by transactions that have not committed.
  • lake_engine.flush_deletion_queue(regclass) and flush_in_progress_queue(): privileged cleanup functions used by maintenance paths.
SELECT to_postgres(application_only_function(payload))
FROM external_events;

Use to_postgres() only when an expression cannot or should not be pushed down; pulling data back into PostgreSQL may substantially increase transfer and execution cost.

Internal State and Caveats

  • The __lake__internal__nsp__ functions are planner/deparser placeholders and are not a supported direct SQL API.
  • Do not manually update or delete queue rows. Cleanup functions need the extension’s object-store credentials and privilege roles and should be invoked only as documented by operational tooling.
  • Version 3.4 adds resolve_metadata to the deletion queue so Iceberg metadata can be expanded into exact referenced files during VACUUM, moving object-store traversal off the DROP path.
  • Roles are cluster-wide objects and can outlive an extension instance in one database; review memberships separately when removing pg_lake.

Last Modified: 2026-07-30: extension update 2026-07-30 (7219c44)