Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion Dockerfile.worker
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ RUN mkdir -p "/build/duckdb-extensions/v${DUCKDB_EXTENSION_VERSION}/linux_${TARG
&& curl -fsSL "${DUCKDB_EXTENSION_REPOSITORY}/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/json.duckdb_extension.gz" \
| gunzip > "/build/duckdb-extensions/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/json.duckdb_extension" \
&& curl -fsSL "${DUCKDB_NIGHTLY_EXTENSION_REPOSITORY}/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/postgres_scanner.duckdb_extension.gz" \
| gunzip > "/build/duckdb-extensions/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/postgres_scanner.duckdb_extension"
| gunzip > "/build/duckdb-extensions/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/postgres_scanner.duckdb_extension" \
&& curl -fsSL "${DUCKDB_NIGHTLY_EXTENSION_REPOSITORY}/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/quack.duckdb_extension.gz" \
| gunzip > "/build/duckdb-extensions/v${DUCKDB_EXTENSION_VERSION}/linux_${TARGETARCH}/quack.duckdb_extension"

FROM debian:bookworm-slim

Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ A PostgreSQL wire protocol compatible server backed by DuckDB. Connect with any
- **Password Authentication**: Cleartext password authentication over TLS
- **Extended Query Protocol**: Support for prepared statements, binary format, and parameterized queries
- **COPY Protocol**: Bulk data import/export with `COPY FROM STDIN` and `COPY TO STDOUT`
- **DuckDB Extensions**: Configurable extension loading (ducklake enabled by default)
- **DuckDB Extensions**: Configurable extension loading (ducklake and quack FROM core_nightly enabled by default)
- **DuckLake Integration**: Auto-attach DuckLake catalogs for lakehouse workflows
- **Rate Limiting**: Built-in protection against brute-force attacks
- **Graceful Shutdown**: Waits for in-flight queries before exiting
Expand Down Expand Up @@ -164,6 +164,7 @@ users:

extensions:
- ducklake
- "quack FROM core_nightly"
- httpfs

ducklake:
Expand Down Expand Up @@ -279,11 +280,12 @@ Options:

## DuckDB Extensions

Extensions are automatically installed and loaded when a user's database is first opened. The `ducklake` extension is enabled by default.
Extensions are automatically installed and loaded when a user's database is first opened. The `ducklake` and `quack` extensions are enabled by default.

```yaml
extensions:
- ducklake # Default - DuckLake lakehouse format
- "quack FROM core_nightly" # Default - DuckDB quack extension
- httpfs # HTTP/S3 file system access
- parquet # Parquet file support (built-in)
- json # JSON support (built-in)
Expand Down
2 changes: 1 addition & 1 deletion configresolve/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func DefaultServerConfig() server.Config {
Users: map[string]string{
"postgres": "postgres",
},
Extensions: []string{"ducklake"},
Extensions: []string{"ducklake", "quack FROM core_nightly"},
DuckLake: server.DuckLakeConfig{
CheckpointInterval: 24 * time.Hour,
DataInliningRowLimit: intPtr(0),
Expand Down
2 changes: 1 addition & 1 deletion duckdbservice/arrow_helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func isNil(i contextQueryer) bool {
return true
}
v := reflect.ValueOf(i)
return v.Kind() == reflect.Ptr && v.IsNil()
return v.Kind() == reflect.Pointer && v.IsNil()
}

// GetQuerySchema executes a query with LIMIT 0 to discover the result schema.
Expand Down
2 changes: 1 addition & 1 deletion duckdbservice/progress.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func extractDuckDBConnection(sqlConn *sql.Conn) (bindings.Connection, error) {
var duckConn bindings.Connection
err := sqlConn.Raw(func(driverConn interface{}) error {
v := reflect.ValueOf(driverConn)
if v.Kind() == reflect.Ptr {
if v.Kind() == reflect.Pointer {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
Expand Down
3 changes: 2 additions & 1 deletion duckgres.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,10 @@ users:
# DuckDB extensions to load on database initialization
# Extensions are installed (downloaded if needed) and loaded automatically
# Common extensions: httpfs, parquet, json, sqlite, postgres, mysql, excel
# Default: ducklake (loaded even without config file)
# Default: ducklake, quack FROM core_nightly (loaded even without config file)
extensions:
- ducklake
- "quack FROM core_nightly"
# - "cache_httpfs FROM community" # Caches S3/HTTP requests locally (requires internet)
# - parquet

Expand Down
1 change: 1 addition & 0 deletions server/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ func TestParseExtensionName(t *testing.T) {
{"cache_httpfs FROM COMMUNITY", "cache_httpfs", "cache_httpfs FROM COMMUNITY"},
{"my_ext FROM my_repo", "my_ext", "my_ext FROM my_repo"},
{"ext FROM source", "ext", "ext FROM source"},
{"quack FROM core_nightly", "quack", "quack FROM core_nightly"},
}

for _, tt := range tests {
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/harness.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ func (h *TestHarness) startDuckgres(harnessCfg HarnessConfig) error {
Users: map[string]string{
"testuser": "testpass",
},
Extensions: []string{"ducklake"},
Extensions: []string{"ducklake", "quack FROM core_nightly"},
RateLimit: server.RateLimitConfig{
MaxConnections: 100,
},
Expand Down
1 change: 1 addition & 0 deletions tests/integration/setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ var knownFailures = map[string]string{
"info_schema_columns_with_default": "DuckDB: column_default not populated",
"info_schema_schemata_all": "DuckDB: schema count differs",
"psql_dt": "DuckDB: pg_class row count differs",
"psql_dn": "DuckDB: schema count differs",

// Query ordering differences (results correct but order differs)
"distinct_multiple": "DuckDB: default ordering differs",
Expand Down
Loading