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 querySELECT * FROM parse_tables('SELECT * FROM my_table');┌─────────┬───────────┬─────────┐│ schema │ table │ context ││ varchar │ varchar │ varchar │├─────────┼───────────┼─────────┤│ main │ my_table │ from │└─────────┴───────────┴─────────┘
-- Parse a query with a CTE and a joinSELECT * 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$$);┌─────────┬──────────────┬────────────┐│ schema │ table │ context ││ varchar │ varchar │ varchar │├─────────┼──────────────┼────────────┤│ │ recent_users │ cte ││ main │ users │ from ││ main │ logins │ join_right ││ main │ recent_users │ from_cte │└─────────┴──────────────┴────────────┘
-- Return a list of table names from a querySELECT 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 fileSELECT parse_table_names(query) AS tables FROM 'user_queries.csv';┌───────────────────────────────┐│ tables ││ varchar[] │├───────────────────────────────┤│ ['users'] ││ ['orders', 'customers'] │└───────────────────────────────┘
-- Structured output as a list of table referencesSELECT 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 sqlSELECT query, is_parsable(query) AS validFROM (VALUES ('SELECT * FROM good_table'), ('BAD SQL SELECT *'), ('WITH cte AS (SELECT 1) SELECT * FROM cte')) AS t(query);┌───────────────────────────────────────────────┬────────┐│ query │ valid ││ varchar │ boolean│├───────────────────────────────────────────────┼────────┤│ SELECT * FROM good_table │ true ││ BAD SQL SELECT * │ false ││ WITH cte AS (SELECT 1) SELECT * FROM cte │ true │└───────────────────────────────────────────────┴────────┘
-- Extract WHERE conditions from a querySELECT * FROM parse_where('SELECT * FROM MyTable WHERE time > 1 AND time < 100');┌────────────────┬────────────┬─────────┐│ condition │ table_name │ context ││ varchar │ varchar │ varchar │├────────────────┼────────────┼─────────┤│ ("time" > 1) │ MyTable │ WHERE ││ ("time" < 100) │ MyTable │ WHERE │└────────────────┴────────────┴─────────┘
-- Return detailed condition breakdown from a querySELECT * FROM parse_where_detailed('SELECT * FROM MyTable WHERE time > 1 AND time < 100');┌─────────────┬───────────────┬─────────┬────────────┬─────────┐│ column_name │ operator_type │ value │ table_name │ context ││ varchar │ varchar │ varchar │ varchar │ varchar │├─────────────┼───────────────┼─────────┼────────────┼─────────┤│ time │ > │ 1 │ MyTable │ WHERE ││ time │ < │ 100 │ MyTable │ WHERE │└─────────────┴───────────────┴─────────┴────────────┴─────────┘
-- Parse a query with a BETWEEN conditionSELECT * FROM parse_where('SELECT * FROM MyTable WHERE time BETWEEN 1 AND 100');┌────────────────────────────┬────────────┬─────────┐│ condition │ table_name │ context ││ varchar │ varchar │ varchar │├────────────────────────────┼────────────┼─────────┤│ ("time" BETWEEN 1 AND 100) │ MyTable │ WHERE │└────────────────────────────┴────────────┴─────────┘
-- Detailed parsing of a BETWEEN conditionSELECT * FROM parse_where_detailed('SELECT * FROM MyTable WHERE time BETWEEN 1 AND 100');┌─────────────┬───────────────┬─────────┬────────────┬─────────┐│ column_name │ operator_type │ value │ table_name │ context ││ varchar │ varchar │ varchar │ varchar │ varchar │├─────────────┼───────────────┼─────────┼────────────┼─────────┤│ time │ >= │ 1 │ MyTable │ WHERE ││ time │ <= │ 100 │ MyTable │ WHERE │└─────────────┴───────────────┴─────────┴────────────┴─────────┘
-- Extract function callsSELECT * FROM parse_functions('SELECT upper(name), count(*) FROM users WHERE length(email) > 0');┌───────────────┬─────────┬─────────┐│ function_name │ schema │ context ││ varchar │ varchar │ varchar │├───────────────┼─────────┼─────────┤│ upper │ main │ select ││ count_star │ main │ select ││ length │ main │ where │└───────────────┴─────────┴─────────┘
-- Parse multi-statement as tableSELECT * 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 statementsSELECT 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.