/quackpipe

DuckDB for ClickHouse users. QuackPipe is an OLAP API built on top of DuckDB with a few extra ClickHouse compatibility bits.

Primary LanguageGoMIT LicenseMIT

a pipe for quackheads

🐤 quackpipe

QuackPipe is an OLAP API built on top of DuckDB with a few extra compatibility bits. If you know, you know.

Play with DuckDB SQL and Cloud storage though a familiar API, without giving up old habits and integrations.

Demos

🐥 try a sample s3/parquet query in our miniature playground (fly.io free tier, 1x-shared-vcpu, 256Mb)
🐥 launch your own free instance on fly.io


🌱 Get Started

Download a binary release, use docker or build from source

🐋 Using Docker

docker pull ghcr.io/metrico/quackpipe:latest
docker run -ti --rm -p 8123:8123 ghcr.io/metrico/quackpipe:latest

📦 Download Binary

curl -fsSL github.com/metrico/quackpipe/releases/latest/download/quackpipe-amd64 --output quackpipe \
&& chmod +x quackpipe
🔌 Start Server w/ parameters
./quackpipe --port 8123
🔌 Start Server w/ file database, READ-ONLY access
./quackpipe --port 8123 --params "/tmp/test.db?access_mode=READ_ONLY"

Run with -h for a full list of parameters

Parameters
params usage default
--port HTTP API Port 8123
--host HTTP API Host 0.0.0.0
--stdin STDIN query mode false
--format FORMAT handler JSONCompact
--params Optional Parameters

👉 Playground

Execute queries using the embedded playground

👉 API

Execute queries using the POST API

curl -X POST https://quackpipe.fly.dev 
   -H "Content-Type: application/json"
   -d 'SELECT version()'  

👉 STDIN

Execute queries using STDIN

# echo "SELECT 'hello', version() as version FORMAT CSV" | ./quackpipe --stdin
hello,v0.7.1

🤜 Extensions

Several extensions are pre-installed by default in Docker images, including parquet, json, httpfs
When using HTTP API, httpfs, parquet, json extensions are automatically pre-loaded by the wrapper.

Users can pre-install extensions and execute quackpipe using a custom parameters:

echo "INSTALL httpfs;" | ./quackpipe --stdin --params "?extension_directory=/tmp/"
./quackpipe --port 8123 --host 0.0.0.0 --params "?extension_directory=/tmp/"

ClickHouse UDF

Quackpipe can be used as executable UDF to get DuckDB data IN/OUT of ClickHouse queries:

SELECT *
FROM executable('quackpipe -stdin -format TSV', TSV, 'id UInt32, num UInt32', (
    SELECT 'SELECT 1, 2'
))
Query id: dd878948-bec8-4abe-9e06-2f5813653c3a
┌─id─┬─num─┐
│  12 │
└────┴─────┘
1 rows in set. Elapsed: 0.155 sec.

🃏 What is this? Think of it as a SELECT within a SELECT with a different syntax.
🃏 Format confusion? Make DuckDB SQL feel like ClickHouse with the included ClickHouse Macro Aliases



🚧 Feature Status

  • DuckDB Core 1
    • cgo binding
    • Extension preloading
    • Aliases Extension
  • REST API 2
    • CH FORMAT Emulation
      • CSV, CSVWithNames
      • TSV, TSVWithNames
      • JSONCompact
      • Native
    • Web Playground (from ClickkHouse, Apache2 Licensed) 3
  • STDIN Fast Query Execution
  • ClickHouse Executable UDF
  • :memory: mode Cloud Storage (s3/r2/minio, httpfs, etc)
  • :file: mode using optional parameters

Contributors

    Contributors @metrico/quackpipe

Community

Stargazers for @metrico/quackpipe

🃏 Disclaimers

Footnotes

  1. DuckDB ® is a trademark of DuckDB Foundation. All rights reserved by their respective owners.

  2. Released under the MIT license. See LICENSE for details. All rights reserved by their respective owners.

  3. ClickHouse ® is a trademark of ClickHouse Inc. No direct affiliation or endorsement.