Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
7f52a4e
refactor(server): extract binding, encoding, and logging seams
asubbarao-ifr Oct 14, 2026
caa5b42
Split quackapi POST boundaries
asubbarao-ifr Oct 14, 2026
0b2e1a7
Replace validation JSON parser with DuckDB JSON
asubbarao-ifr Oct 14, 2026
14abd72
build: register extracted server boundaries
asubbarao-ifr Oct 14, 2026
c94a1ef
feat(encoding): add bounded native JSON chunk encoder
asubbarao-ifr Oct 14, 2026
91bc6bb
Bound quackapi POST execution per database
asubbarao-ifr Oct 14, 2026
400459d
Route outbound POST through HTTPUtil providers
asubbarao-ifr Oct 14, 2026
f86dfd7
feat(encoding): add bounded native CSV chunk writer
asubbarao-ifr Oct 14, 2026
16f7c03
Remove dedicated queue and policy modules
asubbarao-ifr Oct 14, 2026
9aaef12
Remove queue and policy shared integrations
asubbarao-ifr Oct 14, 2026
69c3c4a
Harden POST executor lifecycle and admission
asubbarao-ifr Oct 14, 2026
727078b
Guard POST client reuse configuration
asubbarao-ifr Oct 14, 2026
f6447a5
refactor(server): encode response chunks within byte limit
asubbarao-ifr Oct 14, 2026
99cf8d3
refactor(postgres): remove native libpq path
asubbarao-ifr Oct 14, 2026
e8236c2
refactor(stream): remove SSE stream surface
asubbarao-ifr Oct 14, 2026
74b7027
Remove source-import and table API modules
asubbarao-ifr Oct 14, 2026
93895e1
refactor(server): remove legacy GraphQL stream and postgres paths
asubbarao-ifr Oct 14, 2026
d84ac1b
refactor: remove obsolete route feature surfaces
asubbarao-ifr Oct 14, 2026
a74c60a
fix(encoding): bind json functions in transaction scope
asubbarao-ifr Oct 14, 2026
89f5556
Remove fetch API and isolate POST result contract
asubbarao-ifr Oct 14, 2026
7e4c792
refactor(binding): parse request JSON natively
asubbarao-ifr Oct 14, 2026
9072009
fix(encoding): count only response body bytes
asubbarao-ifr Oct 14, 2026
82f293c
Load JSON dependencies without implicit installs
asubbarao-ifr Oct 14, 2026
960b3df
Reuse reviewed outbound POST clients safely
asubbarao-ifr Oct 14, 2026
26cc79e
Propagate route deadlines into POST workers
asubbarao-ifr Oct 14, 2026
a56fdca
fix: defer JSON requirement until serving
asubbarao-ifr Oct 14, 2026
d424a3d
fix: avoid installing JSON schema from route DDL
asubbarao-ifr Oct 14, 2026
da31c39
refactor(logging): use DuckDB native access logs
asubbarao-ifr Oct 14, 2026
923e5ee
Fix deadline propagation C++11 compatibility
asubbarao-ifr Oct 14, 2026
d896e60
perf(encoding): move completed response buffers
asubbarao-ifr Oct 14, 2026
7ab047d
test: load JSON before starting QuackAPI
asubbarao-ifr Oct 14, 2026
9ee2967
docs: document current QuackAPI surface and migration paths
asubbarao-ifr Oct 14, 2026
c432240
test: separate SQLLogic extension requirements
asubbarao-ifr Oct 14, 2026
58db61d
test: cover typed route encoding and byte boundaries
asubbarao-ifr Oct 14, 2026
4d1a2d5
test: preserve outbound POST surface and provider boundary
asubbarao-ifr Oct 14, 2026
eb4f840
test: assert row-local missing-provider receipt
asubbarao-ifr Oct 14, 2026
5d7c6c9
test: exercise concurrent route contexts and nested encoding
asubbarao-ifr Oct 14, 2026
31d6f68
Update backlog concurrency comment
asubbarao-ifr Oct 14, 2026
137eb01
test: exercise real HTTP POST and concurrency in CI
asubbarao-ifr Oct 14, 2026
0b4e6c8
test: prove POST concurrency limit above 32 is effective
asubbarao-ifr Oct 14, 2026
e475345
test: cancel queued POST without sending it
asubbarao-ifr Oct 14, 2026
f787b2e
test: require provider headers and in-flight route deadline
asubbarao-ifr Oct 14, 2026
0ec467c
test: pin conformance artifact and preserve CLI resource setup
asubbarao-ifr Oct 14, 2026
caaa157
Use loaded JSON extension for validation metadata
asubbarao-ifr Oct 14, 2026
b085c62
test: require prompt cancellation of active POST
asubbarao-ifr Oct 14, 2026
a540541
test: detect duplicate outbound Content-Type headers
asubbarao-ifr Oct 14, 2026
f38726b
Return promptly after POST query cancellation
asubbarao-ifr Oct 14, 2026
6ec97cf
test: keep POST limits independent across databases
asubbarao-ifr Oct 14, 2026
26d6325
Format native HTTP contract tests
asubbarao-ifr Oct 14, 2026
c8d9b98
test: assert removed SQL registrations stay absent
asubbarao-ifr Oct 14, 2026
85b48a4
test: require JSON for retained route smoke
asubbarao-ifr Oct 14, 2026
9ec0beb
test: guard DuckDB settings and extension state
asubbarao-ifr Oct 14, 2026
2554701
test: gate HTTP and HTTPS contracts for both providers
asubbarao-ifr Oct 14, 2026
18adda9
test: assert native access-log credential redaction
asubbarao-ifr Oct 14, 2026
427210b
docs: clarify POST provider and SQL boundaries
asubbarao-ifr Oct 14, 2026
27e51c1
test: cover queued expiry loopback and shutdown
asubbarao-ifr Oct 14, 2026
6e10939
test: cover provider replacement and bounded POST lifecycle
asubbarao-ifr Oct 14, 2026
66caa86
test: assert final HTTP fixture request count
asubbarao-ifr Oct 14, 2026
6e26113
test: verify POST redirects over HTTP and HTTPS
asubbarao-ifr Oct 14, 2026
7a577d4
Fix HTTPFS provider version in CI
asubbarao-ifr Oct 14, 2026
11440ba
Reduce POST executor condition-variable wakeups
asubbarao-ifr Oct 14, 2026
5f0c4b8
docs: explain native and OTLP logging
asubbarao-ifr Oct 14, 2026
b83d4d4
docs: show typed Flight SQL query path
asubbarao-ifr Oct 14, 2026
36f9449
docs: show inferred Flight SQL schemas
asubbarao-ifr Oct 14, 2026
3295ab4
bench: measure real file-reader self-dispatch and exact results
asubbarao-ifr Oct 14, 2026
cc69600
fix: release consumed POST response bodies
asubbarao-ifr Oct 14, 2026
24742b3
docs: distinguish final reader verification from timed artifact
asubbarao-ifr Oct 14, 2026
a8bc680
test: fail reader self-dispatch verifiers on mismatches
asubbarao-ifr Oct 14, 2026
da5b659
test: isolate optional BODY SCHEMA coverage
asubbarao-ifr Oct 14, 2026
cd823e7
ci: run optional BODY SCHEMA coverage with json_schema
asubbarao-ifr Oct 14, 2026
b9d31b3
ci: stage json_schema for BODY SCHEMA gate
asubbarao-ifr Oct 14, 2026
1e00e53
ci: install curl headers for provider checks
asubbarao-ifr Oct 14, 2026
0fbd608
fix: match POST worker state declaration
asubbarao-ifr Oct 14, 2026
741ae14
test: diagnose DuckDB core identity in POST probes
asubbarao-ifr Oct 14, 2026
09c5aa1
test: accept pinned DuckDB source ID prefix lengths
asubbarao-ifr Oct 14, 2026
6d08a64
style: format POST core identity diagnostics
asubbarao-ifr Oct 14, 2026
c2cc036
Use pinned core identity guard in TLS test
asubbarao-ifr Oct 14, 2026
e97c9cd
Add bounded table quackapi_post overload
asubbarao-ifr Oct 14, 2026
cb2ca3e
Round remaining POST deadline milliseconds up
asubbarao-ifr Oct 14, 2026
ce8f668
Include route response body in deadline failure
asubbarao-ifr Oct 14, 2026
931862d
Test bounded table POST dispatch and real HTTP concurrency
asubbarao-ifr Oct 14, 2026
09bc5a7
Document bounded table POST results
asubbarao-ifr Oct 14, 2026
956ccf0
Format table POST contract tests
asubbarao-ifr Oct 14, 2026
9848151
Link bounded POST workload programs
asubbarao-ifr Oct 14, 2026
e1cc7b3
Guard bounded table POST JSON parsing under low memory
asubbarao-ifr Oct 14, 2026
0222d9b
Parameterize table POST benchmark concurrency
asubbarao-ifr Oct 14, 2026
1cc2a33
Format bounded table POST HTTP test
asubbarao-ifr Oct 14, 2026
27cd580
Check table POST typed body and header forwarding
asubbarao-ifr Oct 14, 2026
b12a3bb
Format table POST request contract cases
asubbarao-ifr Oct 14, 2026
0f4637e
Run POST contracts on a core without built-in extensions
asubbarao-ifr Oct 14, 2026
9539ce4
Load the JSON artifact explicitly in POST contract tests
asubbarao-ifr Oct 14, 2026
3cef991
Let the interrupted POST drain before the loopback check
asubbarao-ifr Oct 15, 2026
316ffc7
test: give the same-database loopback a 10s budget (was 1s)
asubbarao Oct 15, 2026
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
161 changes: 124 additions & 37 deletions .github/workflows/MainDistributionPipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,32 +46,15 @@ jobs:
extension_name: quackapi
format_checks: "format"

# Own job (not the reusable distribution workflow): needs `services:` for
# Postgres so require-env QUACKAPI_TEST_PG_DSN tests actually run. Linux
# amd64 only — does not publish artifacts or expand the release matrix.
linux-amd64-pg-sqllogic:
name: Linux amd64 SQLLogic with Postgres
# Focused Linux validation for the SQLLogic suite and real HTTP contracts.
# The released extension uses DuckDB SQL only; no external database service
# is required.
linux-amd64-sqllogic:
name: Linux amd64 SQLLogic
runs-on: ubuntu-24.04
env:
GEN: ninja
DUCKDB_GIT_VERSION: v1.5.6
ENABLE_EXTENSION_AUTOLOADING: "1"
ENABLE_EXTENSION_AUTOINSTALL: "1"
QUACKAPI_TEST_PG_DSN: postgresql://quackapi_pg_cache:qa_pg_cache_test@127.0.0.1:5432/quackapi_pg_cache_test
services:
postgres:
image: postgres:16
env:
POSTGRES_USER: quackapi_pg_cache
POSTGRES_PASSWORD: qa_pg_cache_test
POSTGRES_DB: quackapi_pg_cache_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U quackapi_pg_cache -d quackapi_pg_cache_test"
--health-interval 5s
--health-timeout 5s
--health-retries 10
steps:
- name: Checkout
uses: actions/checkout@v4
Expand All @@ -92,40 +75,144 @@ jobs:
- name: Install build deps
run: |
sudo apt-get update
sudo apt-get install -y ninja-build ccache libpq-dev postgresql-client
sudo apt-get install -y ninja-build ccache libssl-dev libcurl4-openssl-dev

- name: Setup Ccache
uses: hendrikmuhs/ccache-action@main
continue-on-error: true
with:
key: ccache-quackapi-pg-sqllogic-linux-amd64-v1.5.6
restore-keys: ccache-quackapi-pg-sqllogic-linux-amd64-

- name: Wait for Postgres
run: |
until pg_isready -h 127.0.0.1 -p 5432 -U quackapi_pg_cache -d quackapi_pg_cache_test; do
sleep 1
done
key: ccache-quackapi-sqllogic-linux-amd64-v1.5.6
restore-keys: ccache-quackapi-sqllogic-linux-amd64-

- name: Build extension
run: make release -j"$(nproc)"

- name: Run quackapi SQLLogic
run: ./build/release/test/unittest "test/sql/quackapi*"

- name: Verify outbound worker cleanup
- name: Run BODY SCHEMA SQLLogic coverage with local json_schema
run: |
c++ -std=c++17 -pthread -Wall -Wextra -Werror -Isrc/include test/cpp/quackapi_thread_join_test.cpp -o /tmp/quackapi-thread-join-test
/tmp/quackapi-thread-join-test

- name: Verify build without libpq
run: c++ -std=c++17 -fsyntax-only -isystem duckdb/src/include -Isrc/include src/quackapi_pg.cpp
set -euo pipefail
extension_repo="$PWD/build/release/repository"
community_extension_dir="$RUNNER_TEMP/quackapi-community-extensions"
test_extension_dir="$RUNNER_TEMP/quackapi-test-extensions"
test_config="$RUNNER_TEMP/quackapi-test-config.json"
mkdir -p "$community_extension_dir" "$test_extension_dir" "$extension_repo/v1.5.6/linux_amd64"
./build/release/duckdb -no-stdin -c "SET extension_directory='$community_extension_dir'; INSTALL json_schema FROM community;"
cp "$community_extension_dir/v1.5.6/linux_amd64/json_schema.duckdb_extension" \
"$extension_repo/v1.5.6/linux_amd64/"
cat > "$test_config" <<EOF
{"autoloading":"available","settings":[{"name":"extension_directory","value":"$test_extension_dir"}]}
EOF
log_file="$(mktemp)"
LOCAL_EXTENSION_REPO="$extension_repo" ./build/release/test/unittest \
--test-dir "$PWD" --test-config "$test_config" \
"test/sql/quackapi_body_schema.test" 2>&1 | tee "$log_file"
if grep -Eiq "skip.*require json_schema|require json_schema.*skip" "$log_file"; then
echo "BODY SCHEMA coverage was skipped because json_schema was unavailable" >&2
exit 1
fi
if ! grep -Eq "16 assertions" "$log_file"; then
echo "Expected all 16 BODY SCHEMA assertions to run" >&2
exit 1
fi

- name: Verify request database lifetime
run: |
c++ -std=c++17 -pthread -Wall -Wextra -Werror -isystem duckdb/src/include test/cpp/quackapi_lifetime_test.cpp -Lbuild/release/src -lduckdb -Wl,-rpath,"$PWD/build/release/src" -o /tmp/quackapi-lifetime-test
/tmp/quackapi-lifetime-test

- name: Build clean pinned core for loadable extension contracts
run: |
cmake -S duckdb -B build/post-clean-core \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_MAIN_DUCKDB_LIBRARY=ON \
-DBUILD_SHELL=OFF \
-DBUILD_UNITTESTS=OFF \
-DBUILD_BENCHMARKS=OFF \
-DEXTENSION_STATIC_BUILD=FALSE \
-DDUCKDB_EXTENSION_CONFIGS= \
-DDISABLE_BUILTIN_EXTENSIONS=TRUE \
-DDISABLE_EXTENSION_LOAD=FALSE \
-DOVERRIDE_GIT_DESCRIBE=v1.5.6
cmake --build build/post-clean-core --target duckdb -j"$(nproc)"
test -f build/post-clean-core/src/libduckdb.so

- name: Build pinned curl_httpfs POST provider
uses: actions/checkout@v4
with:
repository: asubbarao-ifr/duckdb-curl-filesystem
ref: a48f83c6198a0252672f6f696e446e1525745a8a
path: provider-curl-httpfs
submodules: recursive

- name: Build pinned HTTPFS-Curl POST provider
uses: actions/checkout@v4
with:
repository: asubbarao-ifr/duckdb-httpfs
ref: 748f5ac8dddee531384d9901387d43b0f6a2db43
path: provider-httpfs-curl
submodules: recursive

- name: Build provider artifacts against the tested DuckDB core
run: |
duckdb_core="$PWD/build/release/src/libduckdb_static.a"
test -f "$duckdb_core"
test "$(git -C provider-curl-httpfs rev-parse HEAD)" = a48f83c6198a0252672f6f696e446e1525745a8a
test "$(git -C provider-httpfs-curl rev-parse HEAD)" = 748f5ac8dddee531384d9901387d43b0f6a2db43
test "$(git -C provider-curl-httpfs/duckdb rev-parse HEAD)" = 069cc9f9b5be802405797faecc284961b07c70ef
test "$(git -C provider-httpfs-curl/duckdb rev-parse HEAD)" = 069cc9f9b5be802405797faecc284961b07c70ef
make -C provider-curl-httpfs release -j"$(nproc)" \
EXTENSION_STATIC_BUILD=1 \
EXT_FLAGS="-DPREBUILT_BINARY=$duckdb_core" \
OVERRIDE_GIT_DESCRIBE=v1.5.6
make -C provider-httpfs-curl release -j"$(nproc)" \
EXTENSION_STATIC_BUILD=1 \
EXT_FLAGS="-DPREBUILT_BINARY=$duckdb_core" \
OVERRIDE_GIT_DESCRIBE=v1.5.6

- name: Verify outbound POST over real HTTP with both providers
run: |
quackapi_artifact="$PWD/build/release/extension/quackapi/quackapi.duckdb_extension"
quackapi_version="$(git rev-parse --short HEAD)"
duckdb_test_core="$PWD/build/post-clean-core/src/libduckdb.so"
curl_provider="$PWD/provider-curl-httpfs/build/release/extension/curl_httpfs/curl_httpfs.duckdb_extension"
httpfs_provider="$PWD/provider-httpfs-curl/build/release/extension/httpfs/httpfs.duckdb_extension"
cmake -S test/cpp -B build/post_http_test_curl \
-DQUACKAPI_EXTENSION="$quackapi_artifact" \
-DQUACKAPI_VERSION="$quackapi_version" \
-DDUCKDB_LIBRARY="$duckdb_test_core" \
-DPOST_PROVIDER_EXTENSION="$curl_provider" \
-DPOST_PROVIDER_NAME=curl_httpfs \
-DPOST_PROVIDER_VERSION=v0.4.5 \
-DENABLE_PROVIDER_REPLACEMENT=ON \
-DCURL_HTTPFS_EXTENSION="$curl_provider" \
-DCURL_HTTPFS_VERSION=v0.4.5 \
-DHTTPFS_EXTENSION="$httpfs_provider" \
-DHTTPFS_VERSION=748f5ac
cmake --build build/post_http_test_curl -j"$(nproc)"
echo "DuckDB CLI identity:"
./build/release/duckdb -c "PRAGMA version"
for test_binary in \
build/post_http_test_curl/quackapi_post_http_test \
build/post_http_test_curl/quackapi_post_tls_test \
build/post_http_test_curl/quackapi_provider_replacement_test; do
echo "Runtime dependencies for $test_binary:"
readelf -d "$test_binary" | grep -E 'NEEDED|RPATH|RUNPATH' || true
ldd "$test_binary" | grep -E 'duckdb|not found' || true
done
ctest --test-dir build/post_http_test_curl --output-on-failure
cmake -S test/cpp -B build/post_http_test_httpfs \
-DQUACKAPI_EXTENSION="$quackapi_artifact" \
-DQUACKAPI_VERSION="$quackapi_version" \
-DDUCKDB_LIBRARY="$duckdb_test_core" \
-DPOST_PROVIDER_EXTENSION="$httpfs_provider" \
-DPOST_PROVIDER_NAME=httpfs \
-DPOST_PROVIDER_VERSION=748f5ac
cmake --build build/post_http_test_httpfs -j"$(nproc)"
ctest --test-dir build/post_http_test_httpfs --output-on-failure

- name: Verify benchmark correctness gates
run: |
python3 bench/test_bench_config.py
Expand Down
53 changes: 8 additions & 45 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,21 @@ set(EXTENSION_SOURCES
src/quackapi_extension.cpp
src/quackapi_registry.cpp
src/quackapi_server.cpp
src/quackapi_request_binding.cpp
src/quackapi_response_encoding.cpp
src/quackapi_logging.cpp
src/quackapi_validation.cpp
src/quackapi_batteries.cpp
src/quackapi_ddl.cpp
src/quackapi_auth.cpp
src/quackapi_http_fetch.cpp
src/quackapi_post_result.cpp
src/quackapi_post.cpp
src/quackapi_post_executor.cpp
src/quackapi_post_provider.cpp
src/quackapi_limits.cpp
src/quackapi_middleware.cpp
src/quackapi_table_api.cpp
src/quackapi_openapi.cpp
src/quackapi_graphql.cpp
src/quackapi_queue.cpp
src/quackapi_policy.cpp
src/quackapi_stream.cpp
src/quackapi_from_x.cpp
src/quackapi_util.cpp
src/quackapi_pg.cpp
)

build_static_extension(${TARGET_NAME} ${EXTENSION_SOURCES})
Expand All @@ -50,7 +49,7 @@ target_include_directories(${EXTENSION_NAME} BEFORE PRIVATE ${CMAKE_CURRENT_SOUR
target_include_directories(${LOADABLE_EXTENSION_NAME} BEFORE PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/third_party/httplib)

# The vendored httplib default backlog is 5. That drops loopback connections
# when the outbound pool fans out to its 32-client cap before the server can
# when outbound clients fan out to configured concurrency before the server can
# accept them. Use the platform's full listen backlog for both extension forms.
target_compile_definitions(${EXTENSION_NAME} PRIVATE CPPHTTPLIB_LISTEN_BACKLOG=SOMAXCONN)
target_compile_definitions(${LOADABLE_EXTENSION_NAME} PRIVATE CPPHTTPLIB_LISTEN_BACKLOG=SOMAXCONN)
Expand Down Expand Up @@ -81,42 +80,6 @@ target_include_directories(${LOADABLE_EXTENSION_NAME} PRIVATE
target_link_libraries(${EXTENSION_NAME} duckdb_mbedtls)
target_link_libraries(${LOADABLE_EXTENSION_NAME} duckdb_mbedtls)

# Optional libpq — pure-HTTP Postgres path (same idea as FastAPI+psycopg).
# When pg_dsn is set on quackapi_serve, simple routes run via PQexecParams
# instead of DuckDB ATTACH. Soft: build still succeeds without libpq.
#
# Never link a host-only Homebrew dylib into a cross-arch build (CI osx_amd64
# on arm64 runners finds /opt/homebrew arm64 libpq → link fails).
set(QUACKAPI_TRY_LIBPQ ON)
if (APPLE AND CMAKE_OSX_ARCHITECTURES)
if (CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64" AND
NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "x86_64|amd64|i386")
set(QUACKAPI_TRY_LIBPQ OFF)
message(STATUS "quackapi: skip libpq (target x86_64, host ${CMAKE_HOST_SYSTEM_PROCESSOR})")
elseif (CMAKE_OSX_ARCHITECTURES STREQUAL "arm64" AND
NOT CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "arm64|aarch64")
set(QUACKAPI_TRY_LIBPQ OFF)
message(STATUS "quackapi: skip libpq (target arm64, host ${CMAKE_HOST_SYSTEM_PROCESSOR})")
endif()
endif()
if (QUACKAPI_TRY_LIBPQ)
find_path(QUACKAPI_LIBPQ_INCLUDE libpq-fe.h
HINTS /opt/homebrew/opt/libpq/include /usr/local/opt/libpq/include /usr/include/postgresql)
find_library(QUACKAPI_LIBPQ_LIB pq
HINTS /opt/homebrew/opt/libpq/lib /usr/local/opt/libpq/lib)
endif()
if (QUACKAPI_TRY_LIBPQ AND QUACKAPI_LIBPQ_INCLUDE AND QUACKAPI_LIBPQ_LIB)
message(STATUS "quackapi: libpq found — native Postgres path enabled")
target_include_directories(${EXTENSION_NAME} PRIVATE ${QUACKAPI_LIBPQ_INCLUDE})
target_include_directories(${LOADABLE_EXTENSION_NAME} PRIVATE ${QUACKAPI_LIBPQ_INCLUDE})
target_link_libraries(${EXTENSION_NAME} ${QUACKAPI_LIBPQ_LIB})
target_link_libraries(${LOADABLE_EXTENSION_NAME} ${QUACKAPI_LIBPQ_LIB})
target_compile_definitions(${EXTENSION_NAME} PRIVATE QUACKAPI_HAS_LIBPQ=1)
target_compile_definitions(${LOADABLE_EXTENSION_NAME} PRIVATE QUACKAPI_HAS_LIBPQ=1)
else()
message(STATUS "quackapi: libpq not found — native Postgres path disabled")
endif()

# Response compression: DuckDB-bundled zstd + miniz (gzip). NO new dependencies.
# Citations (verified in this tree / upstream):
# duckdb/third_party/zstd/CMakeLists.txt → add_library(duckdb_zstd STATIC …)
Expand Down
Loading
Loading