An extension is a shared library built for one DuckDB 61,228 version and platform. INSTALL downloads it once into ~/.duckdb/extensions/<version>/<platform>/, LOAD links it into the running process, and many core extensions (httpfs, postgres, iceberg among them) autoload the first time a query needs them. Core extensions are built and signed by the DuckDB project; the community repository holds hundreds of third-party ones, built and signed by DuckDB's CI and installed with FROM community:
SELECT extension_name AS name, installed, loaded, install_mode, installed_from AS repo
FROM duckdb_extensions()
WHERE extension_name IN ('parquet', 'json', 'httpfs', 'postgres_scanner', 'spatial');
INSTALL prql FROM community;
LOAD prql;
from sales
filter status != 'cancelled'
group genre (aggregate {gross = sum gross_amount})
sort {-gross}
take 2;│ name │ installed │ loaded │ install_mode │ repo │ ... │ httpfs │ true │ false │ REPOSITORY │ core │ │ parquet │ true │ true │ STATICALLY_LINKED │ │ │ postgres_scanner │ true │ false │ REPOSITORY │ core │ ... │ Technology │ 934530.50 │ │ Cooking │ 716952.00 │
parquet and json are compiled into the CLI; httpfs and postgres (listed by its old name, postgres_scanner) wait in the cache. After LOAD prql the CLI accepted a PRQL pipeline, a query language the extension compiles to SQL. Extensions run inside your process with its privileges, so DuckDB refuses unsigned ones unless you start it with allow_unsigned_extensions. The cache is kept per DuckDB version (v1.5.5 in the path), so an upgrade installs extensions afresh.