Skip to content

Fluder-Paradyne/mysql-parse-url-udf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MySQL/MariaDB URL Parser UDF

Fast URL parsing functions for MySQL/MariaDB using the Ada URL Parser library.

Functions

  • url_host(url) - Extract hostname
  • url_path(url) - Extract path
  • url_protocol(url) - Extract protocol/scheme
  • url_port(url) - Extract port
  • url_query(url) - Extract query string
  • url_fragment(url) - Extract fragment/hash
  • url_origin(url) - Extract origin
  • url_normalize(url) - Normalize URL
  • url_valid(url) - Check if URL is valid (returns 1 or 0)

Install

First compile the library:

# Using Makefile (easiest)
make
make install  # requires sudo

# Or manually:
# macOS
g++ -std=c++20 -Ideps -bundle -o url_udf.so lib_url_parse_udf.cpp deps/ada.cpp `mysql_config --include`

# Linux
g++ -std=c++20 -Ideps -fPIC -shared -o url_udf.so lib_url_parse_udf.cpp deps/ada.cpp `mysql_config --include`

# Copy to MySQL plugin directory
sudo cp url_udf.so `mysql_config --plugindir`

Then load the functions in MySQL:

mysql -u root -p < sql/install.sql

Or manually:

CREATE FUNCTION url_host RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_path RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_protocol RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_port RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_query RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_fragment RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_origin RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_normalize RETURNS STRING SONAME 'url_udf.so';
CREATE FUNCTION url_valid RETURNS INTEGER SONAME 'url_udf.so';

Run

Example usage:

SELECT url_host('https://example.com:8080/path?query=1#section');
-- Returns: example.com

SELECT url_path('https://example.com:8080/path?query=1#section');
-- Returns: /path

SELECT url_valid('https://example.com');
-- Returns: 1

SELECT url_query('https://example.com?foo=bar&baz=qux');
-- Returns: foo=bar&baz=qux

Test

Run the test suite:

mysql -u root -p < sql/test.sql

Dependencies

  • Ada URL Parser - github.com/ada-url/ada
    • License: MIT/Apache-2.0
    • Files: deps/ada.h and deps/ada.cpp (vendored)

Uninstall

mysql -u root -p < sql/uninstall.sql

Or manually:

DROP FUNCTION IF EXISTS url_host;
DROP FUNCTION IF EXISTS url_path;
DROP FUNCTION IF EXISTS url_protocol;
DROP FUNCTION IF EXISTS url_port;
DROP FUNCTION IF EXISTS url_query;
DROP FUNCTION IF EXISTS url_fragment;
DROP FUNCTION IF EXISTS url_origin;
DROP FUNCTION IF EXISTS url_normalize;
DROP FUNCTION IF EXISTS url_valid;