搜索快捷键 cmd + k | ctrl + k
parser_tools

公开了使用 DuckDB 原生解析器从 SQL 查询中解析引用的表和使用上下文的函数。

维护者:zacMode

安装和加载

INSTALL parser_tools FROM community;
LOAD parser_tools;

示例

-- Extract table references from a simple query
SELECT * 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 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
$$);
┌─────────┬──────────────┬────────────┐
 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 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  
                   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 query
SELECT * 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 query
SELECT * 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 condition
SELECT * 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 condition
SELECT * 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   
└─────────────┴───────────────┴─────────┴────────────┴─────────┘

关于 parser_tools

parser_tools 是一个 DuckDB 扩展,可以使用 DuckDB 的原生解析器来分析 SQL 查询。 它允许您分析 SQL 查询并直接在 SQL 中提取结构信息。 未来版本可能会公开已解析查询结构的其他方面。 有关更多详细信息和示例,请访问扩展仓库

新增函数

function_name (函数名) 函数类型 description (描述) comment (注释) examples (示例)
is_parsable (是否可解析) 标量 NULL NULL  
parse_table_names (解析表名) 标量 NULL NULL  
parse_tables (解析表) 标量 NULL NULL  
parse_tables (解析表) table (表) NULL NULL  
parse_where (解析 WHERE 子句) 标量 NULL NULL  
parse_where (解析 WHERE 子句) table (表) NULL NULL  
parse_where_detailed (详细解析 WHERE 子句) table (表) NULL NULL