Search Shortcut cmd + k | ctrl + k

Read YAML files into DuckDB with native YAML type support, comprehensive extraction functions, and seamless JSON interoperability

Maintainer(s): teaguesterling

Compatibility Matrix

This table covers all DuckDB releases that have not reached end-of-life, including LTS releases, and shows the 2 most recent patch releases of each. Older patch releases are not listed, but the extension may be available for them as well.

Platform 1.4.4 1.4.5 1.5.5 1.5.6 2.0.0
Linux AMD64
Linux ARM64
macOS AMD64
macOS ARM64
Windows AMD64
Windows ARM64
WebAssembly

Installing and Loading

INSTALL yaml FROM community;
LOAD yaml;

Example

-- Load the extension
LOAD yaml;

-- Query YAML files directly
SELECT * FROM 'config.yaml';
SELECT * FROM 'data/*.yml' WHERE active = true;

-- Create tables with YAML columns
CREATE TABLE configs(id INTEGER, config YAML);
INSERT INTO configs VALUES (1, E'server: production\nport: 8080\nfeatures: [logging, metrics]');

-- Extract data using YAML functions
SELECT
    config ->> '$.server' AS environment,  -- Arrow operator
    yaml_extract(config, '$.port') AS port,
    yaml_value(config, '$.port') AS port_scalar
FROM configs;

-- Analyze YAML structure
SELECT yaml_structure(config) FROM configs;
-- Returns: {"server":"VARCHAR","port":"UBIGINT","features":["VARCHAR"]}

-- Check containment and merge documents
SELECT yaml_contains(config, 'server: production') AS is_prod FROM configs;
SELECT yaml_merge_patch(config, 'debug: true') AS with_debug FROM configs;

-- Convert between YAML and JSON
SELECT yaml_to_json(config) AS json_config FROM configs;
SELECT to_yaml({name: 'John', age: 30}) AS yaml_person;

-- Write query results to YAML
COPY (SELECT * FROM users) TO 'output.yaml' (FORMAT yaml, STYLE block);

About yaml

The YAML extension brings comprehensive YAML support to DuckDB, enabling seamless integration of YAML data within SQL queries.

Key Features:

  • Native YAML Type: Full YAML type support with automatic casting between YAML, JSON, and VARCHAR
  • File Reading: Read YAML files with read_yaml() and read_yaml_objects() functions supporting multi-document files, top-level sequences, and robust error handling
  • Direct File Querying: Query YAML files directly using FROM 'file.yaml' syntax
  • Extraction Functions: Query YAML data with yaml_extract(), yaml_type(), yaml_exists(), yaml_value(), ->> operator, and path-based extraction
  • Document Operations: Check containment with yaml_contains(), merge documents with yaml_merge_patch(), and analyze structure with yaml_structure()
  • Type Detection: Comprehensive automatic type detection for temporal types (DATE, TIME, TIMESTAMP), optimal numeric types, and boolean values
  • Column Type Specification: Explicitly define column types when reading YAML files for schema consistency
  • YAML Output: Write query results to YAML files using COPY TO with configurable formatting styles
  • Multi-Document Support: Handle files with multiple YAML documents separated by ---
  • Error Recovery: Continue processing valid documents even when some contain errors
  • JSON Interoperability: Seamless conversion between YAML and JSON formats
  • Frontmatter Extraction: Extract YAML frontmatter metadata from other files

Example Use Cases:

  • Configuration file management and querying
  • Log file analysis and processing
  • Data migration between YAML and relational formats
  • Integration with YAML-based CI/CD pipelines
  • Processing Kubernetes manifests and Helm charts

The extension is built using yaml-cpp and follows DuckDB's extension development best practices, ensuring reliable performance and cross-platform compatibility.

Note: This extension was written primarily using Claude and Claude Code as an exercise in AI-driven development.

Added Functions

function_name function_type description comment examples
-» scalar Extract a scalar value as VARCHAR from a YAML document at the specified path. NULL ['name: Alice' -» '$.name']
copy_format_yaml scalar NULL NULL  
format_yaml scalar Format a SQL value as YAML with configurable style, multiline, and indentation options. NULL [format_yaml({'name': 'Alice', 'hobbies': ['reading', 'gaming']}, style := 'block', indent := 4)]
from_yaml scalar Parse a YAML string or document into a structured DuckDB type. NULL [from_yaml('name: Alice
age: 30', {'name': 'VARCHAR', 'age': 'INTEGER'})]
parse_yaml table Parse a YAML string into a table. NULL [SELECT * FROM parse_yaml('a: 1
b: 2')]
read_yaml table Read YAML files into a tabular format. NULL [SELECT * FROM read_yaml('data.yaml')]
read_yaml_frontmatter table Read YAML frontmatter from documents. NULL [SELECT * FROM read_yaml_frontmatter('doc.md')]
read_yaml_objects table Read YAML files as structured YAML objects. NULL [SELECT * FROM read_yaml_objects('data.yaml')]
to_yaml scalar Convert any SQL value or structure into a YAML document string (alias for value_to_yaml). NULL [to_yaml({'name': 'Alice', 'age': 30})]
value_to_yaml scalar Convert any SQL value or structure into a YAML document string. NULL [value_to_yaml({'name': 'Alice', 'age': 30})]
yaml scalar Parse a YAML string and return a value of YAML type. NULL [yaml('name: Alice')]
yaml_agg aggregate Aggregate values into a YAML array. NULL [yaml_agg(x)]
yaml_array_elements table Unnest a YAML array into rows of YAML values. NULL [SELECT * FROM yaml_array_elements('[10, 20, 30]')]
yaml_array_length scalar Return the number of elements in a YAML array, optionally at a given path. NULL [yaml_array_length('[1, 2, 3]'), yaml_array_length('items: [a, b]', '$.items')]
yaml_build_object scalar Construct a YAML mapping from alternating key and value arguments. NULL [yaml_build_object('name', 'Alice', 'age', 30)]
yaml_contains scalar Check if target YAML document contains candidate YAML document. NULL [yaml_contains('a: 1
b: 2', 'a: 1')]
yaml_each table Unnest a YAML mapping into key-value pairs. NULL [SELECT * FROM yaml_each('a: 1
b: 2')]
yaml_exists scalar Check if a path exists within a YAML document. NULL [yaml_exists('a: 1', '$.a')]
yaml_extract scalar Extract a YAML value from a YAML document at the specified path. NULL [yaml_extract('a: {b: 2}', '$.a.b')]
yaml_extract_path scalar Extract a YAML value from a YAML document at the specified path (alias for yaml_extract). NULL [yaml_extract_path('a: {b: 2}', '$.a.b')]
yaml_extract_path_text scalar Extract a scalar value as VARCHAR from a YAML document at the specified path (alias for yaml_extract_string). NULL [yaml_extract_path_text('name: Alice', '$.name')]
yaml_extract_string scalar Extract a scalar value as VARCHAR from a YAML document at the specified path. NULL [yaml_extract_string('name: Alice', '$.name')]
yaml_get_default_style scalar Get the current default output style for YAML functions. NULL [yaml_get_default_style()]
yaml_get_max_expansion_nodes scalar Get the maximum number of YAML nodes allowed during alias/anchor expansion. NULL [yaml_get_max_expansion_nodes()]
yaml_get_max_input_size scalar Get the maximum allowed byte size for a YAML document. NULL [yaml_get_max_input_size()]
yaml_get_max_nesting_depth scalar Get the maximum allowed nesting depth for YAML parsing. NULL [yaml_get_max_nesting_depth()]
yaml_keys scalar Return the keys of a YAML mapping as a list of VARCHAR, optionally at a given path. NULL [yaml_keys('a: 1
b: 2'), yaml_keys('root: {x: 10, y: 20}', '$.root')]
yaml_merge_patch scalar Apply a JSON Merge Patch (RFC 7386) to a target YAML document. NULL [yaml_merge_patch('a: 1
b: 2', 'a: 3
c: 4')]
yaml_set_default_style scalar Set the default output style for YAML functions ('flow' or 'block'). NULL [yaml_set_default_style('block')]
yaml_set_max_expansion_nodes scalar Set the maximum number of YAML nodes created during alias/anchor expansion. NULL [yaml_set_max_expansion_nodes(100000)]
yaml_set_max_input_size scalar Set the maximum allowed byte size for a YAML document. NULL [yaml_set_max_input_size(10485760)]
yaml_set_max_nesting_depth scalar Set the maximum allowed nesting depth for YAML parsing. NULL [yaml_set_max_nesting_depth(1000)]
yaml_structure scalar Return a JSON representation describing the structure and types of the YAML document. NULL [yaml_structure('a: 1
b: [2, 3]')]
yaml_to_json scalar Convert a YAML string or document to a JSON string. NULL [yaml_to_json('name: Alice
age: 30')]
yaml_type scalar Return the YAML type of the input value or at a given path ('null', 'scalar', 'array', 'object'). NULL [yaml_type('[1, 2, 3]'), yaml_type('a: 1', '$.a')]
yaml_valid scalar Return true if the input string is valid YAML, false otherwise. NULL [yaml_valid('name: Alice')]
yaml_value scalar Extract a scalar value only as VARCHAR from a YAML document, returning NULL for non-scalars. NULL [yaml_value('a: 1', '$.a')]

Overloaded Functions

This extension does not add any function overloads.

Added Types

type_name type_size logical_type type_category internal
yaml 16 VARCHAR STRING true

Added Settings

name description input_type scope aliases typed_value
temp_directory Set the directory to which temporary files are written. VARCHAR GLOBAL [] post.db.tmp
© 2026 DuckDB Foundation, Amsterdam NL
DuckDB Home Code of Conduct Trademark Use Blog