Skip to content

DuckDB Data Dictionary & SQL Catalog

from sqlspec.data_dictionary import get_data_dictionary_loader, get_dialect_config

config = get_dialect_config("duckdb")

Introspects DuckDB table functions (duckdb_tables(), duckdb_columns(), duckdb_indexes(), duckdb_constraints(), duckdb_views(), duckdb_sequences(), duckdb_types(), duckdb_extensions()). See the DuckDB Guide and Data Dictionary Guide for usage examples.

Dialect Configuration

Setting Value
Dialect Name duckdb
Default Schema None
Version Pattern v?(\d+)\.(\d+)\.(\d+)
DDL Strategy Native duckdb_*().sql catalog functions + AST synthesis
Catalog .sql Files 17 files (24 named queries)

Capabilities & Type Mappings

Capability Status / Minimum Version Logical Type Target Physical Type
supports_arrays True array LIST
supports_cte True bigint BIGINT
supports_for_update False blob BLOB
supports_json True boolean BOOLEAN
supports_maps True float DOUBLE
supports_on_conflict True integer INTEGER
supports_prepared_statements True json JSON
supports_schemas True map MAP
supports_skip_locked False struct STRUCT
supports_structs True text TEXT
supports_transactions True timestamp TIMESTAMP
supports_update_from True uuid UUID
supports_uuid True varchar TEXT
supports_window_functions True - -
supports_returning >= 0.8.0 - -
supports_upsert >= 0.8.0 - -

Adapter Data Dictionary Classes

DuckDBDataDictionary

DuckDBDataDictionary()

Bases: SyncDataDictionaryBase

DuckDB-specific sync data dictionary.

Methods:

Name Description
get_version

Get DuckDB database version information.

get_feature_flag

Check if DuckDB database supports a specific feature.

get_optimal_type

Get optimal DuckDB type for a category.

get_tables

Get tables sorted by topological dependency order using DuckDB catalog.

get_columns

Get column information for a table or schema.

get_indexes

Get index metadata for a table or schema.

get_foreign_keys

Get foreign key metadata, including ON DELETE / ON UPDATE actions.

get_constraints

Get PRIMARY KEY, UNIQUE, and CHECK constraint metadata from duckdb_constraints().

get_views

Get view metadata including the catalog CREATE VIEW statement.

get_sequences

Get sequence metadata from duckdb_sequences().

get_types

Get user-defined type metadata from duckdb_types().

get_dependencies

Get DuckDB object dependency metadata from duckdb_dependencies().

Attributes:

Name Type Description
dialect str

get_version

get_version(driver: DuckDBDriver) -> VersionInfo | None

Get DuckDB database version information.

Parameters:

Name Type Description Default
driver DuckDBDriver

DuckDB driver instance.

required

Returns:

Type Description
VersionInfo | None

DuckDB version information or None if detection fails.

get_feature_flag

get_feature_flag(driver: DuckDBDriver, feature: str) -> bool

Check if DuckDB database supports a specific feature.

Parameters:

Name Type Description Default
driver DuckDBDriver

DuckDB driver instance.

required
feature str

Feature name to check.

required

Returns:

Type Description
bool

True if feature is supported, False otherwise.

get_optimal_type

get_optimal_type(driver: DuckDBDriver, type_category: str) -> str

Get optimal DuckDB type for a category.

Parameters:

Name Type Description Default
driver DuckDBDriver

DuckDB driver instance.

required
type_category str

Type category.

required

Returns:

Type Description
str

DuckDB-specific type name.

get_tables

get_tables(
    driver: DuckDBDriver, schema: str | None = None
) -> list[TableMetadata]

Get tables sorted by topological dependency order using DuckDB catalog.

get_columns

get_columns(
    driver: DuckDBDriver, table: str | None = None, schema: str | None = None
) -> list[ColumnMetadata]

Get column information for a table or schema.

get_indexes

get_indexes(
    driver: DuckDBDriver, table: str | None = None, schema: str | None = None
) -> list[IndexMetadata]

Get index metadata for a table or schema.

get_foreign_keys

get_foreign_keys(
    driver: DuckDBDriver, table: str | None = None, schema: str | None = None
) -> list[ForeignKeyMetadata]

Get foreign key metadata, including ON DELETE / ON UPDATE actions.

get_constraints

get_constraints(
    driver: DuckDBDriver, table: str | None = None, schema: str | None = None
) -> MetadataResult

Get PRIMARY KEY, UNIQUE, and CHECK constraint metadata from duckdb_constraints().

Foreign keys are reported by :meth:get_foreign_keys; NOT NULL is reported on columns.

get_views

get_views(driver: DuckDBDriver, schema: str | None = None) -> MetadataResult

Get view metadata including the catalog CREATE VIEW statement.

get_sequences

get_sequences(
    driver: DuckDBDriver, schema: str | None = None
) -> MetadataResult

Get sequence metadata from duckdb_sequences().

get_types

get_types(driver: DuckDBDriver, schema: str | None = None) -> MetadataResult

Get user-defined type metadata from duckdb_types().

get_dependencies

get_dependencies(
    driver: DuckDBDriver,
    object_name: str | None = None,
    schema: str | None = None,
) -> MetadataResult

Get DuckDB object dependency metadata from duckdb_dependencies().

AdbcDataDictionary

AdbcDataDictionary()

Bases: SyncDataDictionaryBase

ADBC multi-dialect data dictionary.

Methods:

Name Description
get_version

Get database version information for the active ADBC dialect.

get_feature_flag

Check if database supports a specific feature.

get_optimal_type

Get optimal database type for a category.

list_available_features
get_metadata_capabilities

Report ADBC transport metadata capabilities without implying DDL fidelity.

get_tables

Get tables for the current dialect.

get_columns

Get column information for a table or schema.

get_indexes

Get index information for a table or schema.

get_foreign_keys

Get foreign key metadata.

get_statistics

Get native driver statistics for a table via ADBC GetStatistics.

get_constraints

Get lossy ADBC constraint shells from GetObjects.

resolve_ddl_dialect

Return the dialect detected from the ADBC driver for parsing and rendering DDL.

resolve_ddl_object_name

Resolve a DDL object name against the dialect detected from the ADBC driver.

exact_catalog_identifier

Return name in the form ADBC metadata getters resolve back to the exact catalog name.

get_system_metadata_capabilities

Get ADBC system metadata capability disclosures.

get_system_metadata

Get ADBC transport metadata through the opt-in system namespace.

Attributes:

Name Type Description
dialect str

get_version

get_version(driver: AdbcDriver) -> VersionInfo | None

Get database version information for the active ADBC dialect.

get_feature_flag

get_feature_flag(driver: AdbcDriver, feature: str) -> bool

Check if database supports a specific feature.

get_optimal_type

get_optimal_type(driver: AdbcDriver, type_category: str) -> str

Get optimal database type for a category.

list_available_features

list_available_features() -> list[str]

get_metadata_capabilities

get_metadata_capabilities(
    driver: AdbcDriver, domains: Sequence[str] | None = None
) -> MetadataCapabilityProfile

Report ADBC transport metadata capabilities without implying DDL fidelity.

get_tables

get_tables(
    driver: AdbcDriver, schema: str | None = None
) -> list[TableMetadata]

Get tables for the current dialect.

get_columns

get_columns(
    driver: AdbcDriver, table: str | None = None, schema: str | None = None
) -> list[ColumnMetadata]

Get column information for a table or schema.

get_indexes

get_indexes(
    driver: AdbcDriver, table: str | None = None, schema: str | None = None
) -> list[IndexMetadata]

Get index information for a table or schema.

get_foreign_keys

get_foreign_keys(
    driver: AdbcDriver, table: str | None = None, schema: str | None = None
) -> list[ForeignKeyMetadata]

Get foreign key metadata.

get_statistics

get_statistics(
    driver: AdbcDriver,
    table: str,
    schema: str | None = None,
    *,
    approximate: bool = True,
) -> list[TableStatisticsMetadata]

Get native driver statistics for a table via ADBC GetStatistics.

get_constraints

get_constraints(
    driver: AdbcDriver, table: str | None = None, schema: str | None = None
) -> MetadataResult

Get lossy ADBC constraint shells from GetObjects.

resolve_ddl_dialect

resolve_ddl_dialect(driver: AdbcDriver) -> str | None

Return the dialect detected from the ADBC driver for parsing and rendering DDL.

resolve_ddl_object_name

resolve_ddl_object_name(
    driver: AdbcDriver, object_name: str, schema: str | None
) -> tuple[str, str | None]

Resolve a DDL object name against the dialect detected from the ADBC driver.

exact_catalog_identifier

exact_catalog_identifier(driver: AdbcDriver, name: str) -> str

Return name in the form ADBC metadata getters resolve back to the exact catalog name.

get_system_metadata_capabilities

get_system_metadata_capabilities(
    driver: Any, domains: Sequence[str] | None = None
) -> tuple[SystemMetadataCapability, ...]

Get ADBC system metadata capability disclosures.

get_system_metadata

get_system_metadata(
    driver: AdbcDriver,
    request: SystemMetadataRequest | str | None = None,
    **kwargs: Any,
) -> SystemMetadataResult

Get ADBC transport metadata through the opt-in system namespace.

ArrowOdbcDataDictionary

ArrowOdbcDataDictionary(dialect: str = 'sqlite')

Bases: SyncDataDictionaryBase

Runtime-dialect data dictionary for generic ODBC connections.

Methods:

Name Description
get_dialect_config

Return the runtime dialect configuration for this data dictionary.

get_query

Return an exact domain query for the runtime dialect.

get_query_text

Return raw SQL text for an exact runtime dialect query.

get_metadata_capabilities

Report Arrow ODBC metadata capabilities without claiming raw catalog support.

resolve_schema

Return a schema name using runtime dialect defaults when missing.

resolve_identifier

Return a runtime-dialect-normalized identifier.

get_version

Get database version information when the runtime dialect provides a query.

get_feature_flag

Check whether the runtime dialect supports a feature.

get_optimal_type

Get the optimal runtime dialect type for a category.

get_tables

Get table metadata for dialects with bundled catalog queries.

get_columns

Get column metadata for dialects with bundled catalog queries.

get_indexes

Get index metadata for dialects with bundled catalog queries.

get_foreign_keys

Get foreign-key metadata for dialects with bundled catalog queries.

Attributes:

Name Type Description
dialect str

get_dialect_config

get_dialect_config() -> DialectConfig

Return the runtime dialect configuration for this data dictionary.

get_query

get_query(domain: str, operation: str, *, mode: str | None = None) -> SQL

Return an exact domain query for the runtime dialect.

get_query_text

get_query_text(domain: str, operation: str, *, mode: str | None = None) -> str

Return raw SQL text for an exact runtime dialect query.

get_metadata_capabilities

get_metadata_capabilities(
    driver: ArrowOdbcDriver, domains: Sequence[str] | None = None
) -> MetadataCapabilityProfile

Report Arrow ODBC metadata capabilities without claiming raw catalog support.

resolve_schema

resolve_schema(schema: str | None) -> str | None

Return a schema name using runtime dialect defaults when missing.

resolve_identifier

resolve_identifier(identifier: str) -> str

Return a runtime-dialect-normalized identifier.

get_version

get_version(driver: ArrowOdbcDriver) -> VersionInfo | None

Get database version information when the runtime dialect provides a query.

get_feature_flag

get_feature_flag(driver: ArrowOdbcDriver, feature: str) -> bool

Check whether the runtime dialect supports a feature.

get_optimal_type

get_optimal_type(driver: ArrowOdbcDriver, type_category: str) -> str

Get the optimal runtime dialect type for a category.

get_tables

get_tables(
    driver: ArrowOdbcDriver, schema: str | None = None
) -> list[TableMetadata]

Get table metadata for dialects with bundled catalog queries.

get_columns

get_columns(
    driver: ArrowOdbcDriver, table: str | None = None, schema: str | None = None
) -> list[ColumnMetadata]

Get column metadata for dialects with bundled catalog queries.

get_indexes

get_indexes(
    driver: ArrowOdbcDriver, table: str | None = None, schema: str | None = None
) -> list[IndexMetadata]

Get index metadata for dialects with bundled catalog queries.

get_foreign_keys

get_foreign_keys(
    driver: ArrowOdbcDriver, table: str | None = None, schema: str | None = None
) -> list[ForeignKeyMetadata]

Get foreign-key metadata for dialects with bundled catalog queries.

Catalog SQL Queries

The duckdb dialect pack defines 24 named queries across 17 domain .sql files loaded via DataDictionaryLoader (sqlspec/data_dictionary/dialects/duckdb/):

Domain Pack Named Queries Bind Parameters
columns.sql by_schema, by_table :schema_name, :table_name
constraints.sql by_schema, by_table :schema_name, :table_name
databases.sql list none
ddl.sql by_object, by_schema :object_name, :object_type, :schema_name
dependencies.sql by_schema :schema_name
extensions.sql list none
foreign_keys.sql by_table, by_schema :schema_name, :table_name
functions.sql by_schema :schema_name
indexes.sql by_schema, by_table :schema_name, :table_name
objects.sql by_schema :schema_name
schemas.sql list none
sequences.sql by_schema :schema_name
system.sql logs, memory, settings none
tables.sql by_schema :schema_name
types.sql by_schema :schema_name
version.sql current none
views.sql by_schema :schema_name
columns.sql (2 named queries)
-- name: by_schema
-- dialect: duckdb
WITH table_ddl AS (
    SELECT
        database_name,
        schema_name,
        table_name,
        regexp_replace(sql, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') AS ddl_quoted,
        regexp_replace(sql, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g') AS ddl_unquoted
    FROM duckdb_tables()
    WHERE schema_name = COALESCE(:schema_name, current_schema())
),
pk_constraints AS (
    SELECT
        database_name,
        schema_name,
        table_name,
        unnest(constraint_column_names) AS column_name
    FROM duckdb_constraints()
    WHERE constraint_type = 'PRIMARY KEY'
      AND schema_name = COALESCE(:schema_name, current_schema())
)
SELECT
    c.database_name,
    c.schema_name,
    c.table_name,
    c.column_name,
    c.column_index AS ordinal_position,
    c.data_type,
    c.is_nullable,
    c.column_default,
    c.character_maximum_length AS max_length,
    c.numeric_precision,
    c.numeric_scale,
    c.comment,
    c.internal,
    pk.column_name IS NOT NULL AS is_primary,
    COALESCE(
        contains(
            t.ddl_unquoted,
            '(' || c.column_name || ' ' || regexp_replace(c.data_type, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g')
            || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_unquoted,
            ', ' || c.column_name || ' ' || regexp_replace(c.data_type, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g')
            || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_quoted,
            '("' || replace(c.column_name, '"', '""') || '" '
            || regexp_replace(c.data_type, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_quoted,
            ', "' || replace(c.column_name, '"', '""') || '" '
            || regexp_replace(c.data_type, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') || ' GENERATED ALWAYS AS('
        ),
        FALSE
    ) AS is_generated
FROM duckdb_columns() AS c
LEFT JOIN table_ddl AS t
    ON t.database_name = c.database_name
    AND t.schema_name = c.schema_name
    AND t.table_name = c.table_name
LEFT JOIN pk_constraints AS pk
    ON pk.database_name = c.database_name
    AND pk.schema_name = c.schema_name
    AND pk.table_name = c.table_name
    AND pk.column_name = c.column_name
WHERE c.schema_name = COALESCE(:schema_name, current_schema())
  AND NOT c.internal
ORDER BY c.table_name, c.column_index;

-- name: by_table
-- dialect: duckdb
WITH table_ddl AS (
    SELECT
        database_name,
        schema_name,
        table_name,
        regexp_replace(sql, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') AS ddl_quoted,
        regexp_replace(sql, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g') AS ddl_unquoted
    FROM duckdb_tables()
    WHERE schema_name = COALESCE(:schema_name, current_schema())
      AND table_name = :table_name
),
pk_constraints AS (
    SELECT
        database_name,
        schema_name,
        table_name,
        unnest(constraint_column_names) AS column_name
    FROM duckdb_constraints()
    WHERE constraint_type = 'PRIMARY KEY'
      AND schema_name = COALESCE(:schema_name, current_schema())
      AND table_name = :table_name
)
SELECT
    c.database_name,
    c.schema_name,
    c.table_name,
    c.column_name,
    c.column_index AS ordinal_position,
    c.data_type,
    c.is_nullable,
    c.column_default,
    c.character_maximum_length AS max_length,
    c.numeric_precision,
    c.numeric_scale,
    c.comment,
    c.internal,
    pk.column_name IS NOT NULL AS is_primary,
    COALESCE(
        contains(
            t.ddl_unquoted,
            '(' || c.column_name || ' ' || regexp_replace(c.data_type, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g')
            || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_unquoted,
            ', ' || c.column_name || ' ' || regexp_replace(c.data_type, '"([^"]|"")*"|''([^'']|'''')*''', '', 'g')
            || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_quoted,
            '("' || replace(c.column_name, '"', '""') || '" '
            || regexp_replace(c.data_type, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') || ' GENERATED ALWAYS AS('
        )
        OR contains(
            t.ddl_quoted,
            ', "' || replace(c.column_name, '"', '""') || '" '
            || regexp_replace(c.data_type, '("([^"]|"")*")|''([^'']|'''')*''', '\1', 'g') || ' GENERATED ALWAYS AS('
        ),
        FALSE
    ) AS is_generated
FROM duckdb_columns() AS c
LEFT JOIN table_ddl AS t
    ON t.database_name = c.database_name
    AND t.schema_name = c.schema_name
    AND t.table_name = c.table_name
LEFT JOIN pk_constraints AS pk
    ON pk.database_name = c.database_name
    AND pk.schema_name = c.schema_name
    AND pk.table_name = c.table_name
    AND pk.column_name = c.column_name
WHERE c.schema_name = COALESCE(:schema_name, current_schema())
  AND c.table_name = :table_name
  AND NOT c.internal
ORDER BY c.column_index;
constraints.sql (2 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    table_name,
    constraint_name,
    constraint_type,
    constraint_text,
    expression,
    constraint_column_names,
    referenced_table,
    referenced_column_names
FROM duckdb_constraints()
WHERE schema_name = COALESCE(:schema_name, current_schema())
ORDER BY table_name, constraint_index;

-- name: by_table
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    table_name,
    constraint_name,
    constraint_type,
    constraint_text,
    expression,
    constraint_column_names,
    referenced_table,
    referenced_column_names
FROM duckdb_constraints()
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND table_name = :table_name
ORDER BY constraint_index;
databases.sql (1 named queries)
-- name: list
-- dialect: duckdb
SELECT
    database_name,
    path,
    type,
    readonly,
    internal
FROM duckdb_databases()
WHERE NOT internal
ORDER BY database_name;
ddl.sql (2 named queries)
-- name: by_object
-- dialect: duckdb
WITH fk_tables AS (
    SELECT DISTINCT
        database_name,
        schema_name,
        table_name
    FROM duckdb_constraints()
    WHERE database_name = current_database()
      AND constraint_type = 'FOREIGN KEY'
),
ddl_objects AS (
    SELECT
        t.schema_name,
        t.table_name AS object_name,
        CASE WHEN t.temporary THEN 'temporary_table' ELSE 'table' END AS object_type,
        t.table_name AS table_name,
        t.sql,
        fk.table_name IS NOT NULL AS has_foreign_keys
    FROM duckdb_tables() AS t
    LEFT JOIN fk_tables AS fk
        ON fk.database_name = t.database_name
       AND fk.schema_name = t.schema_name
       AND fk.table_name = t.table_name
    WHERE NOT t.internal
      AND t.database_name = current_database()
      AND t.sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        view_name AS object_name,
        'view' AS object_type,
        NULL AS table_name,
        sql,
        FALSE AS has_foreign_keys
    FROM duckdb_views()
    WHERE NOT internal
      AND database_name = current_database()
      AND sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        index_name AS object_name,
        'index' AS object_type,
        table_name AS table_name,
        sql,
        FALSE AS has_foreign_keys
    FROM duckdb_indexes()
    WHERE database_name = current_database()
      AND sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        sequence_name AS object_name,
        'sequence' AS object_type,
        NULL AS table_name,
        'CREATE SEQUENCE '
            || CASE WHEN schema_name = 'main' THEN '' ELSE '"' || replace(schema_name, '"', '""') || '".' END
            || '"' || replace(sequence_name, '"', '""') || '"'
            || ' INCREMENT BY ' || increment_by
            || ' MINVALUE ' || min_value
            || ' MAXVALUE ' || max_value
            || ' START WITH ' || start_value
            || CASE WHEN cycle THEN ' CYCLE' ELSE ' NO CYCLE' END
            || ';' AS sql,
        FALSE AS has_foreign_keys
    FROM duckdb_sequences()
    WHERE database_name = current_database()
    UNION ALL
    SELECT
        schema_name,
        type_name AS object_name,
        'type' AS object_type,
        NULL AS table_name,
        CASE
            WHEN logical_type = 'ENUM' AND labels IS NOT NULL THEN
                'CREATE TYPE '
                    || CASE WHEN schema_name = 'main' THEN '' ELSE '"' || replace(schema_name, '"', '""') || '".' END
                    || '"' || replace(type_name, '"', '""') || '" AS ENUM ('
                    || array_to_string(
                        list_transform(labels, lambda x: '''' || replace(x, '''', '''''') || ''''),
                        ', '
                    ) || ');'
            ELSE NULL
        END AS sql,
        FALSE AS has_foreign_keys
    FROM duckdb_types()
    WHERE NOT internal
      AND database_name = current_database()
      AND logical_type = 'ENUM'
      AND labels IS NOT NULL
)
SELECT
    schema_name,
    object_name,
    object_type,
    table_name,
    sql AS ddl,
    has_foreign_keys,
    'native' AS fidelity
FROM ddl_objects
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND object_name = :object_name
  AND sql IS NOT NULL
  AND (:object_type IS NULL OR object_type = LOWER(:object_type))
ORDER BY schema_name, object_type, object_name;

-- name: by_schema
-- dialect: duckdb
WITH fk_tables AS (
    SELECT DISTINCT
        database_name,
        schema_name,
        table_name
    FROM duckdb_constraints()
    WHERE database_name = current_database()
      AND constraint_type = 'FOREIGN KEY'
),
ddl_objects AS (
    SELECT
        t.schema_name,
        t.table_name AS object_name,
        CASE WHEN t.temporary THEN 'temporary_table' ELSE 'table' END AS object_type,
        t.table_name AS table_name,
        t.sql,
        fk.table_name IS NOT NULL AS has_foreign_keys
    FROM duckdb_tables() AS t
    LEFT JOIN fk_tables AS fk
        ON fk.database_name = t.database_name
       AND fk.schema_name = t.schema_name
       AND fk.table_name = t.table_name
    WHERE NOT t.internal
      AND t.database_name = current_database()
      AND t.sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        view_name AS object_name,
        'view' AS object_type,
        NULL AS table_name,
        sql,
        FALSE AS has_foreign_keys
    FROM duckdb_views()
    WHERE NOT internal
      AND database_name = current_database()
      AND sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        index_name AS object_name,
        'index' AS object_type,
        table_name AS table_name,
        sql,
        FALSE AS has_foreign_keys
    FROM duckdb_indexes()
    WHERE database_name = current_database()
      AND sql IS NOT NULL
    UNION ALL
    SELECT
        schema_name,
        sequence_name AS object_name,
        'sequence' AS object_type,
        NULL AS table_name,
        'CREATE SEQUENCE '
            || CASE WHEN schema_name = 'main' THEN '' ELSE '"' || replace(schema_name, '"', '""') || '".' END
            || '"' || replace(sequence_name, '"', '""') || '"'
            || ' INCREMENT BY ' || increment_by
            || ' MINVALUE ' || min_value
            || ' MAXVALUE ' || max_value
            || ' START WITH ' || start_value
            || CASE WHEN cycle THEN ' CYCLE' ELSE ' NO CYCLE' END
            || ';' AS sql,
        FALSE AS has_foreign_keys
    FROM duckdb_sequences()
    WHERE database_name = current_database()
    UNION ALL
    SELECT
        schema_name,
        type_name AS object_name,
        'type' AS object_type,
        NULL AS table_name,
        CASE
            WHEN logical_type = 'ENUM' AND labels IS NOT NULL THEN
                'CREATE TYPE '
                    || CASE WHEN schema_name = 'main' THEN '' ELSE '"' || replace(schema_name, '"', '""') || '".' END
                    || '"' || replace(type_name, '"', '""') || '" AS ENUM ('
                    || array_to_string(
                        list_transform(labels, lambda x: '''' || replace(x, '''', '''''') || ''''),
                        ', '
                    ) || ');'
            ELSE NULL
        END AS sql,
        FALSE AS has_foreign_keys
    FROM duckdb_types()
    WHERE NOT internal
      AND database_name = current_database()
      AND logical_type = 'ENUM'
      AND labels IS NOT NULL
)
SELECT
    schema_name,
    object_name,
    object_type,
    table_name,
    sql AS ddl,
    has_foreign_keys,
    'native' AS fidelity
FROM ddl_objects
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND sql IS NOT NULL
ORDER BY
    CASE object_type
        WHEN 'type' THEN 1
        WHEN 'sequence' THEN 2
        WHEN 'table' THEN 3
        WHEN 'temporary_table' THEN 4
        WHEN 'view' THEN 5
        WHEN 'index' THEN 6
        ELSE 7
    END,
    object_name;
dependencies.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
WITH object_inventory AS (
    SELECT
        database_name,
        schema_name,
        table_oid AS object_oid,
        table_name AS object_name,
        'table' AS object_type
    FROM duckdb_tables()
    WHERE schema_name = COALESCE(:schema_name, current_schema())
    UNION ALL
    SELECT
        database_name,
        schema_name,
        index_oid AS object_oid,
        index_name AS object_name,
        'index' AS object_type
    FROM duckdb_indexes()
    WHERE schema_name = COALESCE(:schema_name, current_schema())
    UNION ALL
    SELECT
        database_name,
        schema_name,
        view_oid AS object_oid,
        view_name AS object_name,
        'view' AS object_type
    FROM duckdb_views()
    WHERE schema_name = COALESCE(:schema_name, current_schema())
)
SELECT
    dependent.database_name,
    dependent.schema_name,
    dependent.object_name,
    dependent.object_type,
    referenced.object_name AS referenced_object_name,
    referenced.object_type AS referenced_object_type,
    dep.classid,
    dep.objid,
    dep.objsubid,
    dep.refclassid,
    dep.refobjid,
    dep.refobjsubid,
    dep.deptype
FROM duckdb_dependencies() AS dep
LEFT JOIN object_inventory AS dependent ON dependent.object_oid = dep.objid
LEFT JOIN object_inventory AS referenced ON referenced.object_oid = dep.refobjid
WHERE dependent.object_oid IS NOT NULL
   OR referenced.object_oid IS NOT NULL
ORDER BY dependent.object_type, dependent.object_name, referenced.object_type, referenced.object_name;
extensions.sql (1 named queries)
-- name: list
-- dialect: duckdb
SELECT
    extension_name,
    loaded,
    installed,
    install_path,
    description,
    aliases,
    extension_version,
    install_mode,
    installed_from
FROM duckdb_extensions()
ORDER BY extension_name;
foreign_keys.sql (2 named queries)
-- name: by_table
-- dialect: duckdb
SELECT
    kcu.table_name,
    kcu.column_name,
    pk_kcu.table_name AS referenced_table_name,
    pk_kcu.column_name AS referenced_column_name,
    kcu.constraint_name,
    kcu.table_schema,
    pk_kcu.table_schema AS referenced_table_schema,
    rc.delete_rule,
    rc.update_rule
FROM information_schema.key_column_usage kcu
JOIN information_schema.referential_constraints rc
  ON kcu.constraint_name = rc.constraint_name
  AND kcu.constraint_schema = rc.constraint_schema
JOIN information_schema.key_column_usage pk_kcu
  ON rc.unique_constraint_name = pk_kcu.constraint_name
  AND rc.unique_constraint_schema = pk_kcu.constraint_schema
  AND kcu.ordinal_position = pk_kcu.ordinal_position
WHERE kcu.table_schema = COALESCE(:schema_name, current_schema())
  AND kcu.table_name = :table_name
ORDER BY kcu.table_name, kcu.constraint_name, kcu.ordinal_position;

-- name: by_schema
-- dialect: duckdb
SELECT
    kcu.table_name,
    kcu.column_name,
    pk_kcu.table_name AS referenced_table_name,
    pk_kcu.column_name AS referenced_column_name,
    kcu.constraint_name,
    kcu.table_schema,
    pk_kcu.table_schema AS referenced_table_schema,
    rc.delete_rule,
    rc.update_rule
FROM information_schema.key_column_usage kcu
JOIN information_schema.referential_constraints rc
  ON kcu.constraint_name = rc.constraint_name
  AND kcu.constraint_schema = rc.constraint_schema
JOIN information_schema.key_column_usage pk_kcu
  ON rc.unique_constraint_name = pk_kcu.constraint_name
  AND rc.unique_constraint_schema = pk_kcu.constraint_schema
  AND kcu.ordinal_position = pk_kcu.ordinal_position
WHERE kcu.table_schema = COALESCE(:schema_name, current_schema())
ORDER BY kcu.table_name, kcu.constraint_name, kcu.ordinal_position;
functions.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    function_name,
    function_type,
    return_type,
    parameters,
    parameter_types,
    macro_definition,
    has_side_effects,
    internal,
    comment,
    tags
FROM duckdb_functions()
WHERE schema_name = COALESCE(:schema_name, current_schema())
ORDER BY function_type, function_name;
indexes.sql (2 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    table_name,
    index_name,
    is_unique,
    is_primary,
    expressions AS columns,
    comment,
    tags,
    sql AS native_sql
FROM duckdb_indexes()
WHERE schema_name = COALESCE(:schema_name, current_schema())
ORDER BY table_name, index_name;

-- name: by_table
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    table_name,
    index_name,
    is_unique,
    is_primary,
    expressions AS columns,
    comment,
    tags,
    sql AS native_sql
FROM duckdb_indexes()
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND table_name = :table_name
ORDER BY index_name;
objects.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    table_name AS object_name,
    'table' AS object_type,
    comment,
    tags,
    internal,
    temporary,
    sql AS native_sql
FROM duckdb_tables()
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND NOT internal
UNION ALL
SELECT
    database_name,
    schema_name,
    view_name AS object_name,
    'view' AS object_type,
    comment,
    tags,
    internal,
    temporary,
    sql AS native_sql
FROM duckdb_views()
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND NOT internal
ORDER BY object_type, object_name;
schemas.sql (1 named queries)
-- name: list
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    internal,
    sql AS native_sql
FROM duckdb_schemas()
WHERE NOT internal
ORDER BY database_name, schema_name;
sequences.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    sequence_name,
    temporary,
    start_value,
    min_value,
    max_value,
    increment_by,
    cycle,
    last_value,
    comment,
    tags,
    sql AS native_sql
FROM duckdb_sequences()
WHERE schema_name = COALESCE(:schema_name, current_schema())
ORDER BY sequence_name;
system.sql (3 named queries)
-- name: logs
-- dialect: duckdb
SELECT *
FROM duckdb_logs();

-- name: memory
-- dialect: duckdb
SELECT *
FROM duckdb_memory();

-- name: settings
-- dialect: duckdb
SELECT
    name,
    value,
    description,
    input_type,
    scope,
    aliases
FROM duckdb_settings()
ORDER BY name;
tables.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
WITH RECURSIVE dependency_tree AS (
    SELECT
        t.table_name,
        0 AS level,
        [t.table_name] AS path
    FROM information_schema.tables t
    WHERE t.table_type = 'BASE TABLE'
      AND t.table_schema = COALESCE(:schema_name, current_schema())
      AND NOT EXISTS (
          SELECT 1
          FROM information_schema.key_column_usage kcu
          JOIN information_schema.referential_constraints rc
            ON kcu.constraint_name = rc.constraint_name
            AND kcu.constraint_schema = rc.constraint_schema
          JOIN information_schema.key_column_usage pk_kcu
            ON rc.unique_constraint_name = pk_kcu.constraint_name
            AND rc.unique_constraint_schema = pk_kcu.constraint_schema
          WHERE kcu.table_name = t.table_name
            AND kcu.table_schema = t.table_schema
            AND pk_kcu.table_name <> t.table_name
      )

    UNION ALL

    SELECT
        kcu.table_name,
        dt.level + 1,
        list_append(dt.path, kcu.table_name)
    FROM information_schema.key_column_usage kcu
    JOIN information_schema.referential_constraints rc
      ON kcu.constraint_name = rc.constraint_name
      AND kcu.constraint_schema = rc.constraint_schema
    JOIN information_schema.key_column_usage pk_kcu
      ON rc.unique_constraint_name = pk_kcu.constraint_name
      AND rc.unique_constraint_schema = pk_kcu.constraint_schema
    JOIN dependency_tree dt ON dt.table_name = pk_kcu.table_name
    WHERE kcu.table_schema = COALESCE(:schema_name, current_schema())
      AND pk_kcu.table_name <> kcu.table_name
      AND NOT list_contains(dt.path, kcu.table_name)
),
dependency_levels AS (
    SELECT
        table_name,
        MAX(level) AS dependency_level
    FROM dependency_tree
    GROUP BY table_name
)
SELECT
    t.table_name,
    COALESCE(dl.dependency_level, 0) AS level,
    COALESCE(dl.dependency_level, 0) AS dependency_level
FROM information_schema.tables t
LEFT JOIN dependency_levels dl ON dl.table_name = t.table_name
WHERE t.table_type = 'BASE TABLE'
  AND t.table_schema = COALESCE(:schema_name, current_schema())
ORDER BY level, t.table_name;
types.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    type_name,
    logical_type,
    labels
FROM duckdb_types()
WHERE NOT internal
  AND schema_name = COALESCE(:schema_name, current_schema())
ORDER BY type_name;
version.sql (1 named queries)
-- name: current
-- dialect: duckdb
SELECT version() AS version;
views.sql (1 named queries)
-- name: by_schema
-- dialect: duckdb
SELECT
    database_name,
    schema_name,
    view_name,
    comment,
    tags,
    internal,
    temporary,
    sql AS native_sql
FROM duckdb_views()
WHERE schema_name = COALESCE(:schema_name, current_schema())
  AND NOT internal
ORDER BY view_name;