parser_tools

Stellt Funktionen bereit, um referenzierte Tabellen und Nutzungskontext aus SQL-Abfragen mit DuckDBs nativem Parser zu extrahieren.

Maintainer: zfarrell

Installation und Laden

INSTALL parser_tools FROM community;
LOAD parser_tools;

Beispiel

-- Extract table references from a simple query
SELECT * FROM parse_tables('SELECT * FROM my_table');
┌─────────┬───────────┬─────────┐
schematable │ context │
varcharvarcharvarchar
├─────────┼───────────┼─────────┤
│ main │ my_table │ from
└─────────┴───────────┴─────────┘
-- Parse a query with a CTE and a join
SELECT * FROM parse_tables($$
WITH recent_users AS (SELECT * FROM users WHERE created_at > now() - INTERVAL '7 days')
SELECT * FROM recent_users r JOIN logins l ON r.id = l.user_id
$$);
┌─────────┬──────────────┬────────────┐
schematable │ context │
varcharvarcharvarchar
├─────────┼──────────────┼────────────┤
│ │ recent_users │ cte │
│ main │ users │ from
│ main │ logins │ join_right │
│ main │ recent_users │ from_cte │
└─────────┴──────────────┴────────────┘
-- Return a list of table names from a query
SELECT parse_table_names('SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id');
┌────────────────────────────────────┐
│ parse_table_names │
varchar[] │
├────────────────────────────────────┤
│ ['orders', 'customers'] │
└────────────────────────────────────┘
-- Parse queries from a csv file
SELECT parse_table_names(query) AS tables FROM 'user_queries.csv';
┌───────────────────────────────┐
│ tables │
varchar[] │
├───────────────────────────────┤
│ ['users'] │
│ ['orders', 'customers'] │
└───────────────────────────────┘
-- Structured output as a list of table references
SELECT parse_tables('SELECT * FROM products p JOIN inventory i ON p.sku = i.sku');
┌────────────────────────────────────────────────────────────────────────────┐
│ parse_tables │
│ list<struct<schema: varchar, table: varchar, context: varchar>>
├────────────────────────────────────────────────────────────────────────────┤
│ [{'schema': 'main', 'table': 'products', 'context': 'from'}, │
│ {'schema': 'main', 'table': 'inventory', 'context': 'join_right'}] │
└────────────────────────────────────────────────────────────────────────────┘
-- Detect invalid sql
SELECT query, is_parsable(query) AS valid
FROM (VALUES
('SELECT * FROM good_table'),
('BAD SQL SELECT *'),
('WITH cte AS (SELECT 1) SELECT * FROM cte')
) AS t(query);
┌───────────────────────────────────────────────┬────────┐
│ query │ valid │
varcharboolean
├───────────────────────────────────────────────┼────────┤
SELECT * FROM good_table │ true │
│ BAD SQL SELECT * │ false │
WITH cte AS (SELECT 1) SELECT * FROM cte │ true │
└───────────────────────────────────────────────┴────────┘
-- Extract WHERE conditions from a query
SELECT * FROM parse_where('SELECT * FROM MyTable WHERE time > 1 AND time < 100');
┌────────────────┬────────────┬─────────┐
│ condition │ table_name │ context │
varcharvarcharvarchar
├────────────────┼────────────┼─────────┤
│ ("time" > 1) │ MyTable │ WHERE
│ ("time" < 100) │ MyTable │ WHERE
└────────────────┴────────────┴─────────┘
-- Return detailed condition breakdown from a query
SELECT * FROM parse_where_detailed('SELECT * FROM MyTable WHERE time > 1 AND time < 100');
┌─────────────┬───────────────┬─────────┬────────────┬─────────┐
│ column_name │ operator_type │ value │ table_name │ context │
varcharvarcharvarcharvarcharvarchar
├─────────────┼───────────────┼─────────┼────────────┼─────────┤
time>1 │ MyTable │ WHERE
time<100 │ MyTable │ WHERE
└─────────────┴───────────────┴─────────┴────────────┴─────────┘
-- Parse a query with a BETWEEN condition
SELECT * FROM parse_where('SELECT * FROM MyTable WHERE time BETWEEN 1 AND 100');
┌────────────────────────────┬────────────┬─────────┐
│ condition │ table_name │ context │
varcharvarcharvarchar
├────────────────────────────┼────────────┼─────────┤
│ ("time" BETWEEN 1 AND 100) │ MyTable │ WHERE
└────────────────────────────┴────────────┴─────────┘
-- Detailed parsing of a BETWEEN condition
SELECT * FROM parse_where_detailed('SELECT * FROM MyTable WHERE time BETWEEN 1 AND 100');
┌─────────────┬───────────────┬─────────┬────────────┬─────────┐
│ column_name │ operator_type │ value │ table_name │ context │
varcharvarcharvarcharvarcharvarchar
├─────────────┼───────────────┼─────────┼────────────┼─────────┤
time>=1 │ MyTable │ WHERE
time<=100 │ MyTable │ WHERE
└─────────────┴───────────────┴─────────┴────────────┴─────────┘
-- Extract function calls
SELECT * FROM parse_functions('SELECT upper(name), count(*) FROM users WHERE length(email) > 0');
┌───────────────┬─────────┬─────────┐
│ function_name │ schema │ context │
varcharvarcharvarchar
├───────────────┼─────────┼─────────┤
│ upper │ main │ select
│ count_star │ main │ select
length │ main │ where
└───────────────┴─────────┴─────────┘
-- Parse multi-statement as table
SELECT * from parse_statements('SELECT 42; INSERT INTO log VALUES (1); SELECT 43;') as statements;
┌──────────────────────────────┐
statement
varchar
├──────────────────────────────┤
SELECT 42
INSERT INTO log (VALUES (1)) │
SELECT 43
└──────────────────────────────┘
-- Count statements
SELECT num_statements('SELECT 1; SELECT 2; SELECT 3;');
┌────────────────┐
│ num_statements │
│ int64 │
├────────────────┤
3
└────────────────┘

Über parser_tools

parser_tools ist eine DuckDB-Erweiterung für die Introspektion von SQL-Abfragen mit DuckDBs nativem Parser. Sie ermöglicht es Ihnen, SQL-Abfragen zu analysieren und strukturelle Informationen direkt in SQL zu extrahieren. Künftige Versionen können weitere Aspekte der geparsten Abfragestruktur bereitstellen. Weitere Details und Beispiele finden Sie im Erweiterungs-Repository.

Hinzugefügte Funktionen

function_name function_type description comment examples
is_parsable scalar NULL NULL
num_statements scalar NULL NULL
parse_function_names scalar NULL NULL
parse_functions scalar NULL NULL
parse_functions table NULL NULL
parse_statements scalar NULL NULL
parse_statements table NULL NULL
parse_table_names scalar NULL NULL
parse_tables scalar NULL NULL
parse_tables table NULL NULL
parse_where scalar NULL NULL
parse_where table NULL NULL
parse_where_detailed table NULL NULL

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.