chdb 0.1.1
==========

## Synopsis

``` psql
# CREATE EXTENSION chdb;
CREATE EXTENSION

# SELECT * FROM chdb_query('version()') AS (version text);
 version
----------
 26.7.2.1
(1 row)
```

## Description

The `chdb` extension runs [chDB] queries in a helper process.

## Functions

### `pgchdb_version`

```sql
SELECT pgchdb_version();
```

Returns the current [semantic version][semver] of the chdb extension library.
While the chdb extension version uses only the `x.y` part of the version, the
library provides the full `x.y.z` [semantic version][semver]. This value will
be the same as that returned by the Postgres 18 and later
[`pg_get_loaded_modules()`] function:

```sql
SELECT version
  FROM pg_get_loaded_modules()
 WHERE module_name = 'chdb';
```

### `chdb_query`

```sql
SELECT * FROM chdb_query('SELECT version()') AS (version text);
```

Executes a [chDB] query return its rows as a relation. Each call creates a
temporary chDB database on disk and deletes it once the query completes. As a
result, no objects created by previous `chdb_query()` calls, such as DDL,
persist to subsequent calls.

A column definition list (`AS (col type, ...)`) is required: PostgreSQL
requires the row structure definition before fetching rows, and that structure
must match the columns the query returns. Values are converted from chDB to
the declared types.

No role has `EXECUTE` access by default; `GRANT` to a role to allow it to use
the function.

```sql
GRANT EXECUTE ON FUNCTION chdb_query(text) TO chdb_admin;
```

**Example:**

```sql
SELECT * FROM chdb_query(
    'SELECT number AS n, number * number FROM numbers(5) ORDER BY n'
) AS (n int2, p int);
```

Output:

```
 n | p
---+----
 0 |  0
 1 |  1
 2 |  4
 3 |  9
 4 | 16
(5 rows)
```

## Text Encoding

See [Text Encoding in the `chdb_hook` documentation][text encoding] for how
chDB byte strings map to Postgres `text`, `bytea`, and other types.

## Settings

### `chdb.max_memory`

```sql
SET chdb.max_memory = '1 GB';
```

The maximum amount of memory for a chDB query, used to set the chDB
[`max_memory_usage`] setting. Requires superuser privileges. Use an integer
for the number of megabytes or one of the following memory units:

*   `B` (bytes)
*   `kB` (kilobytes)
*   `MB` (megabytes)
*   `GB` (gigabytes)
*   `TB` (terabytes)

Defaults to `0`, which does not limit the memory.

### `chdb.max_threads`

```sql
SET chdb.max_threads = 4;
```

The maximum number of query processing threads for a chDB query, used to set
the chDB [`max_threads`] setting. Requires superuser privileges. Defaults to
`0`, which allows chDB to determine the value.

We strongly encourage setting `chdb.max_threads` before executing a major
query in order to prevent chDB from maxing out CPU usage at the expense of
PostgreSQL.

### `chdb.max_parsing_threads`

```sql
SET chdb.max_parsing_threads = 2;
```

The maximum number of threads chDB can use to parse data in input formats that
support parallel parsing, used to set the chDB [`max_parsing_threads`]
setting. Requires superuser privileges. Defaults to `0`, which allows chDB to
determine the value.

We encourage setting `chdb.max_parsing_threads` before executing a query that
parses a lot of data, such as loading data from [table functions], in order to
prevent chDB from maxing out CPU usage at the expense of PostgreSQL.

## Versioning Policy

The chdb extension adheres to [Semantic Versioning][semver] for its public
releases.

*   The major version increments for API changes
*   The minor version increments for backward compatible SQL changes
*   The patch version increments for binary-only changes

Once installed, PostgreSQL tracks two variations of the version:

*   The library version (defined by `PG_MODULE_MAGIC` on PostgreSQL 18 and
    higher) includes the full semantic version, visible in the output of the
    `pgchdb_version()` function or the Postgres [`pg_get_loaded_modules()`]
    function.
*   The extension version (defined in the control file) includes only the
    major and minor versions, visible in the `pg_catalog.pg_extension` table,
    the output of the `pg_available_extension_versions()` function, and
    `\dx chdb`.

In practice this means that a release that increments the patch version, e.g.
from `v0.1.0` to `v0.1.1`, benefits all databases that have loaded `v0.1` and
do not need to run `ALTER EXTENSION` to benefit from the upgrade.

A release that increments the minor or major versions, on the other hand, will
be accompanied by SQL upgrade scripts, and all existing database that contain
the extension must run `ALTER EXTENSION chdb UPDATE` to benefit from the
upgrade.

## Authors

*   [David E. Wheeler](https://justatheory.com/)
*   [serprex](https://github.com/serprex)

## Copyright

Copyright (c) 2026, ClickHouse

  [chDB]: https://clickhouse.com/chdb
    "chDB - fast, reliable, and scalable in-process database"
  [`pg_get_loaded_modules()`]: https://pgpedia.info/g/pg_get_loaded_modules.html
    "pgPedia: pg_get_loaded_modules()"
  [`max_memory_usage`]: https://clickhouse.com/docs/reference/settings/session-settings/max-memory-usage
    "ClickHouse Docs: max_memory_usage_* session settings"
  [`max_threads`]: https://clickhouse.com/docs/reference/settings/session-settings/max-threads
    "ClickHouse Docs: max_threads_* session settings"
  [`max_parsing_threads`]: https://clickhouse.com/docs/reference/settings/session-settings/max#max_parsing_threads
    "ClickHouse Docs: max_parsing_threads session setting"
  [table functions]: https://clickhouse.com/docs/reference/functions/table-functions
    "ClickHouse Docs: Table Functions"
  [text encoding]: ./chdb_hook.md#text-encoding
    "chdb_hook Docs: Text Encoding"
  [semver]: https://semver.org/spec/v2.0.0.html "Semantic Versioning 2.0.0"
