Connects DuckDB to any database that has an Arrow Database Connectivity (ADBC) driver.
Maintainer(s):
columnar-tech
Installing and Loading
INSTALL adbc FROM community;
LOAD adbc;
Example
-- Install and load the ADBC extension
INSTALL adbc FROM community;
LOAD adbc;
-- Read from an attached ADBC database (SQLite) given a connection profile using read_adbc
D SELECT * FROM read_adbc('profile://mydb', 'SELECT * FROM games');
┌───────┬────────────┬─────────────────────┬─────────┬─────────┬─────────────┬─────────────┬────────────┐
│ id │ name │ inventor │ year │ min_age │ min_players │ max_players │ list_price │
│ int64 │ varchar │ varchar │ varchar │ int64 │ int64 │ int64 │ varchar │
├───────┼────────────┼─────────────────────┼─────────┼─────────┼─────────────┼─────────────┼────────────┤
│ 1 │ Monopoly │ Elizabeth Magie │ 1903 │ 8 │ 2 │ 6 │ 19.99 │
│ 2 │ Scrabble │ Alfred Mosher Butts │ 1938 │ 8 │ 2 │ 4 │ 17.99 │
│ 3 │ Clue │ Anthony E. Pratt │ 1944 │ 8 │ 2 │ 6 │ 9.99 │
│ 4 │ Candy Land │ Eleanor Abbott │ 1948 │ 3 │ 2 │ 4 │ 7.99 │
│ 5 │ Risk │ Albert Lamorisse │ 1957 │ 10 │ 2 │ 5 │ 29.99 │
└───────┴────────────┴─────────────────────┴─────────┴─────────┴─────────────┴─────────────┴────────────┘
-- Create a persistent connection via ATTACH
D ATTACH 'profile://mydb' AS mydb (TYPE adbc);
-- Alternatively, ATTACH with a custom delimiter (i.e., SELECT * FROM [schema].[table] for SQL Server)
D ATTACH 'profile://mydb' AS otherdb (TYPE adbc, DELIMITER '[]');
-- Set the default schema
D USE mydb.main;
-- Display all tables in the attached ADBC database
D SHOW ALL TABLES;
┌──────────┬─────────┬─────────┬───────────────────────────────┬────────────────────────────────┬───────────┐
│ database │ schema │ name │ column_names │ column_types │ temporary │
│ varchar │ varchar │ varchar │ varchar[] │ varchar[] │ boolean │
├──────────┼─────────┼─────────┼───────────────────────────────┼────────────────────────────────┼───────────┤
│ mydb │ main │ games │ [id, name, inventor, year, │ [BIGINT, VARCHAR, VARCHAR, │ false │
│ │ │ │ min_age, min_players, │ VARCHAR, BIGINT, BIGINT, │ │
│ │ │ │ max_players, list_price] │ BIGINT, VARCHAR] │ │
└──────────┴─────────┴─────────┴───────────────────────────────┴────────────────────────────────┴───────────┘
-- Read directly from the attached ADBC table
D SELECT * FROM games;
┌───────┬────────────┬─────────────────────┬─────────┬─────────┬─────────────┬─────────────┬────────────┐
│ id │ name │ inventor │ year │ min_age │ min_players │ max_players │ list_price │
│ int64 │ varchar │ varchar │ varchar │ int64 │ int64 │ int64 │ varchar │
├───────┼────────────┼─────────────────────┼─────────┼─────────┼─────────────┼─────────────┼────────────┤
│ 1 │ Monopoly │ Elizabeth Magie │ 1903 │ 8 │ 2 │ 6 │ 19.99 │
│ 2 │ Scrabble │ Alfred Mosher Butts │ 1938 │ 8 │ 2 │ 4 │ 17.99 │
│ 3 │ Clue │ Anthony E. Pratt │ 1944 │ 8 │ 2 │ 6 │ 9.99 │
│ 4 │ Candy Land │ Eleanor Abbott │ 1948 │ 3 │ 2 │ 4 │ 7.99 │
│ 5 │ Risk │ Albert Lamorisse │ 1957 │ 10 │ 2 │ 5 │ 29.99 │
└───────┴────────────┴─────────────────────┴─────────┴─────────┴─────────────┴─────────────┴────────────┘
-- Insert into the ADBC database
D INSERT INTO games (SELECT 6, 'Battleship', 'Clifford Von Wickler', 1931, 7, 2, 2, 12.99);
D SELECT * FROM games;
┌───────┬────────────┬──────────────────────┬─────────┬─────────┬─────────────┬─────────────┬────────────┐
│ id │ name │ inventor │ year │ min_age │ min_players │ max_players │ list_price │
│ int64 │ varchar │ varchar │ varchar │ int64 │ int64 │ int64 │ varchar │
├───────┼────────────┼──────────────────────┼─────────┼─────────┼─────────────┼─────────────┼────────────┤
│ 1 │ Monopoly │ Elizabeth Magie │ 1903 │ 8 │ 2 │ 6 │ 19.99 │
│ 2 │ Scrabble │ Alfred Mosher Butts │ 1938 │ 8 │ 2 │ 4 │ 17.99 │
│ 3 │ Clue │ Anthony E. Pratt │ 1944 │ 8 │ 2 │ 6 │ 9.99 │
│ 4 │ Candy Land │ Eleanor Abbott │ 1948 │ 3 │ 2 │ 4 │ 7.99 │
│ 5 │ Risk │ Albert Lamorisse │ 1957 │ 10 │ 2 │ 5 │ 29.99 │
│ 6 │ Battleship │ Clifford Von Wickler │ 1931 │ 7 │ 2 │ 2 │ 12.99 │
└───────┴────────────┴──────────────────────┴─────────┴─────────┴─────────────┴─────────────┴────────────┘
-- Create a local table in DuckDB of the inventors of each game
D CREATE TABLE memory.inventors AS (SELECT id, inventor FROM games);
-- Create a new table in the attached ADBC database (SQLite) of the inventors
D CREATE TABLE game_inventors(id, inventor) AS (SELECT * FROM memory.inventors);
D SELECT * FROM game_inventors;
┌───────┬──────────────────────┐
│ id │ inventor │
│ int64 │ varchar │
├───────┼──────────────────────┤
│ 1 │ Elizabeth Magie │
│ 2 │ Alfred Mosher Butts │
│ 3 │ Anthony E. Pratt │
│ 4 │ Eleanor Abbott │
│ 5 │ Albert Lamorisse │
│ 6 │ Clifford Von Wickler │
└───────┴──────────────────────┘
-- Execute arbitrary DDL via adbc_execute
D CALL adbc_execute('profile://mydb', 'DROP TABLE games');
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true │
└─────────┘
-- Clear local metadata cache after remote schema changes
D CALL adbc_clear_cache();
About adbc
Use DuckDB (v1.4.5+ or v1.5.4+) to query Snowflake, Databricks, BigQuery, PostgreSQL, MySQL, or any other system with an ADBC driver. ADBC (Arrow Database Connectivity) is a universal data-access API built on Apache Arrow, an efficient, columnar data format that almost every data system supports natively. By building on Arrow, ADBC enables:
- Lightning-fast (zero-copy) data transfer between column-oriented analytical databases, bypassing the slow column-to-row and row-to-column conversions typical of legacy row-based APIs like ODBC or JDBC.
- Seamless interoperability with a large and growing ecosystem of Arrow-compatible systems.
Key Capabilities
- Supports catalog lookups,
SELECT,INSERT,COPY, andCREATE TABLE AS(CTAS) statements directly on attached databases. - Supports custom delimiters with
ATTACH(e.g.,DELIMITER '[]') to support systems with different table/schema delimiters. - Supports built-in connection pooling for each attached database (tunable with
adbc_connection_pool_size) - Support streaming bulk ingest for
INSERT,COPY, and CTAS statements, keeping memory usage low even for data sets that exceed main memory (tunable withadbc_insert_buffer_size).Known Limitations
- Operates exclusively in Autocommit Mode.
- Predicate and projection pushdowns are not automatically performed for attached tables; use direct
read_adbc()queries to push projections and predicates to remote ADBC databases. - Concurrent ADBC operations within a single process are not supported. Mixing ADBC reads and writes in the same SQL statement is also restricted by default unless explicitly permitted via
adbc_mix_reads_writes. For more information see the documentation.
- Supports catalog lookups,
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| adbc_clear_cache | table | NULL | NULL | |
| adbc_execute | table | NULL | NULL | |
| read_adbc | table | NULL | NULL |
Overloaded Functions
This extension does not add any function overloads.
Added Types
This extension does not add any types.
Added Settings
| name | description | input_type | scope | aliases |
|---|---|---|---|---|
| adbc_connection_pool_size | The number of connections (default 50) to pool (cache) before the catalog creates ephemeral connections to serve requests. | BIGINT | GLOBAL | [] |
| adbc_insert_buffer_size | The number of chunks (default 1000) to buffer in memory before inserting via ADBC. | BIGINT | GLOBAL | [] |
| adbc_materialize_insert_rows | Whether input rows for INSERTs are materialized before inserting via ADBC. | BOOLEAN | GLOBAL | [] |
| adbc_mix_reads_writes | Whether ADBC reads and writes can be mixed within the same SQL statement (default false). | BOOLEAN | GLOBAL | [] |