Search Shortcut cmd + k | ctrl + k
urlpattern

WHATWG URLPattern API for matching and extracting components from URLs using pattern syntax

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 urlpattern FROM community;
LOAD urlpattern;

Example

-- Test if a URL matches a pattern
SELECT urlpattern_test('https://example.com/users/:id', 'https://example.com/users/123');
-- true

-- Extract a named group from a URL
SELECT urlpattern_extract('https://example.com/users/:id', 'https://example.com/users/123', 'id');
-- '123'

-- Get full match results with all components
SELECT urlpattern_exec('/posts/:slug', '/posts/hello-world');
-- {matched: true, pathname: '/posts/hello-world', groups: {slug: 'hello-world'}, ...}

-- Use the URLPATTERN type for validated patterns
SELECT urlpattern_test(urlpattern('/api/:version/*'), '/api/v2/users/list');
-- true

About urlpattern

The URLPattern extension implements the WHATWG URLPattern API for DuckDB, enabling powerful URL matching, extraction, parsing, and construction.

Features

  • Custom URLPATTERN type with validation and implicit casting from VARCHAR
  • Pattern matching with named groups (:name), wildcards (*), and regex groups
  • URL parsing into components (protocol, host, path, query, hash)
  • URL building and modification from components
  • Query parameter extraction as MAP or individual values
  • Pattern caching for improved performance (~320k matches/sec)

Key Functions

Function Description
urlpattern_test(pattern, url) Test if URL matches pattern
urlpattern_extract(pattern, url, group) Extract a named group
urlpattern_exec(pattern, url) Get full match results as STRUCT
url_parse(url) Parse URL into struct with all components
url_build(...) Build URL from named components
url_modify(url, ...) Modify existing URL components
url_search_params(url) Get query parameters as MAP

Pattern Syntax

URLPattern uses a syntax similar to Express.js routes:

  • :name - Named parameter (matches any segment)
  • * - Wildcard (matches everything)
  • /path/:id - Path-only patterns match any protocol/host

For full documentation, see duckdb-urlpattern.readthedocs.io.

Added Functions

function_name function_type description comment examples
url_build scalar Build a URL string from named component parameters. NULL [url_build(protocol := 'https', hostname := 'example.com', pathname := '/api')]
url_hash scalar Get the hash/fragment component of a URL. NULL [url_hash('https://example.com#section')]
url_host scalar Get the host (hostname and port) component of a URL. NULL [url_host('https://example.com:8080')]
url_hostname scalar Get the hostname component of a URL. NULL [url_hostname('https://example.com:8080')]
url_href scalar Get the normalized full href of a URL. NULL [url_href('https://example.com/path')]
url_modify scalar Modify components of an existing URL string. NULL [url_modify('https://example.com/api', pathname := '/v2')]
url_origin scalar Get the origin (scheme + host) of a URL. NULL [url_origin('https://example.com/path')]
url_parse scalar Parse a URL string into a STRUCT of its components. NULL [url_parse('https://user:[email protected]:8080/path?q=1#hash')]
url_password scalar Get the password component of a URL. NULL [url_password('https://user:[email protected]')]
url_pathname scalar Get the pathname component of a URL. NULL [url_pathname('https://example.com/api/v1')]
url_port scalar Get the port component of a URL. NULL [url_port('https://example.com:8080')]
url_protocol scalar Get the protocol component of a URL. NULL [url_protocol('https://example.com')]
url_resolve scalar Resolve a relative URL against a base URL. NULL [url_resolve('https://example.com/dir/', '../other')]
url_search scalar Get the query string component of a URL. NULL [url_search('https://example.com?q=1')]
url_search_param scalar Extract the value of a specific query parameter from a URL. NULL [url_search_param('https://example.com?a=1&b=2', 'a')]
url_search_params scalar Extract all query search parameters from a URL as a MAP. NULL [url_search_params('https://example.com?a=1&b=2')]
url_username scalar Get the username component of a URL. NULL [url_username('https://user:[email protected]')]
url_valid scalar Check if a URL string is valid. NULL [url_valid('https://example.com')]
urlpattern scalar Construct a URLPATTERN from a pattern string. NULL [urlpattern('/users/:id')]
urlpattern_exec scalar Execute pattern matching on a URL and return matched components and groups as a STRUCT. NULL [urlpattern_exec(urlpattern('/users/:id'), '/users/123')]
urlpattern_extract scalar Extract matched component value from a URL using URLPattern. NULL [urlpattern_extract(urlpattern('/users/:id'), '/users/123', 'id')]
urlpattern_hash scalar Get the hash/fragment pattern of a URLPattern. NULL [urlpattern_hash(urlpattern('https://example.com/#'))]
urlpattern_hostname scalar Get the hostname pattern of a URLPattern. NULL [urlpattern_hostname(urlpattern('https://example.com/*'))]
urlpattern_init scalar Initialize a URLPATTERN with named component patterns. NULL [urlpattern_init(pathname := '/users/:id')]
urlpattern_pathname scalar Get the pathname pattern of a URLPattern. NULL [urlpattern_pathname(urlpattern('/users/:id'))]
urlpattern_port scalar Get the port pattern of a URLPattern. NULL [urlpattern_port(urlpattern('https://example.com:8080/*'))]
urlpattern_protocol scalar Get the protocol pattern of a URLPattern. NULL [urlpattern_protocol(urlpattern('https://example.com/*'))]
urlpattern_search scalar Get the search/query pattern of a URLPattern. NULL [urlpattern_search(urlpattern('https://example.com/?q='))]
urlpattern_test scalar Test if a URL matches a URLPattern. NULL [urlpattern_test(urlpattern('/users/:id'), '/users/123')]

Overloaded Functions

This extension does not add any function overloads.

Added Types

type_name type_size logical_type type_category internal
URLPATTERN 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