用parser_tools插件来解析SQL语句

解析SQL语句的parser_tools插件
C:\d>duckdb140
DuckDB v1.4.0 (Andium) b8a06e4a22
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D INSTALL parser_tools FROM community;
100% ▕██████████████████████████████████████▏ (00:00:02.45 elapsed)
D LOAD parser_tools;
D SELECT * FROM parse_tables('SELECT * FROM my_table');
┌─────────┬──────────┬─────────┐
│ schematable   │ context │
│ varcharvarcharvarchar │
├─────────┼──────────┼─────────┤
│ main    │ my_table │ from    │
└─────────┴──────────┴─────────┘
D 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    │ recent_users │ from_cte   │
│ main    │ logins       │ join_right │
└─────────┴──────────────┴────────────┘
D SELECT parse_table_names('SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id');
┌───────────────────────────────────────────────────────────────────────────────────────────────┐
│ parse_table_names('SELECT * FROM orders JOIN customers ON orders.customer_id = customers.id') │
│                                           varchar[]                                           │
├───────────────────────────────────────────────────────────────────────────────────────────────┤
│ [orders, customers]                                                                           │
└───────────────────────────────────────────────────────────────────────────────────────────────┘
D SELECT parse_table_names(query) AS tables FROM 'user_queries.csv';
IO Error:
No files found that match the pattern "user_queries.csv"
D SELECT parse_tables('SELECT * FROM products p JOIN inventory i ON p.sku = i.sku');
┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│                     parse_tables('SELECT * FROM products p JOIN inventory i ON p.sku = i.sku')                      │
│                            struct("schema" varchar, "table" varchar, context varchar)[]                             │
├─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ [{'schema': main, 'table': products, 'context': from}, {'schema': main, 'table': inventory, 'context': join_right}] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
D 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    │
└──────────────────────────────────────────┴─────────┘
D 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   │
└────────────────┴────────────┴─────────┘
D 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   │
└─────────────┴───────────────┴─────────┴────────────┴─────────┘
D 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   │
└────────────────────────────┴────────────┴─────────┘
D 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   │
└─────────────┴───────────────┴─────────┴────────────┴─────────┘
D 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   │
└───────────────┴─────────┴─────────┘
D 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                    │
└──────────────────────────────┘
D SELECT num_statements('SELECT 1; SELECT 2; SELECT 3;');
┌─────────────────────────────────────────────────┐
│ num_statements('SELECT 1; SELECT 2; SELECT 3;') │
│                      int64                      │
├─────────────────────────────────────────────────┤
│                        3                        │
└─────────────────────────────────────────────────┘
D SELECT * FROM parse_tables('PIVOT cities ON year USING sum(population);');
┌─────────┬─────────┬─────────┐
│ schematable  │ context │
│ varcharvarcharvarchar │
├─────────┴─────────┴─────────┤
│           0 rows            │
└─────────────────────────────┘
D

根据存储库页面 https://github.com/zfarrell/duckdb_extension_parser_tools 介绍,这个实验性插件目前只能解析SELECT语句,所以PIVOT解析不出结果。

#!/bin/bash err_ftp_id=$1 scr_file_path=$2 time_path=$3 mysql_ip=$4 mysql_port=${5} mysql_usr=${6} mysql_pwd=${7} parser_log=${8} date1=$(echo ${time_path:0:4}-${time_path:4:2}-${time_path:6:2}) time1=$(echo ${time_path:8:2}-${time_path:10:2}-${time_path:12:2}) function get_ftp_info(){ ftp_id=$1 mysql_jdbc="mysql -h${mysql_ip} -P${mysql_port} -u${mysql_usr} -p${mysql_pwd} dolphinscheduler -s -e" ftp_sql="select REPLACE(JSON_EXTRACT(tdd.connection_params, '\$.ftpServer'), '\"', '') ftp_host,\ ifnull(REPLACE(JSON_EXTRACT(tdd.connection_params, '\$.ftpPort'), '\"', ''),21) ftp_port, REPLACE(JSON_EXTRACT(tdd.connection_params, '\$.ftpUserName'), '\"', '') ftp_user, REPLACE(JSON_EXTRACT(tdd.connection_params, '\$.ftpUserPwd'), '\"', '') ftp_pwd, tbf.ftp_dir from dolphinscheduler.t_biz_ftp tbf join dolphinscheduler.t_ds_datasource tdd on tbf.datasource_id = tdd.id where tbf.id=$ftp_id" echo $($mysql_jdbc "${ftp_sql}") } err_ftp_info=`get_ftp_info $err_ftp_id` err_ftp_host=`echo $err_ftp_info |awk -F ' ' '{print $1}'` err_ftp_port=`echo $err_ftp_info |awk -F ' ' '{print $2}'` err_ftp_usr=`echo $err_ftp_info |awk -F ' ' '{print $3}'` err_ftp_pwd=`echo $err_ftp_info |awk -F ' ' '{print $4}'` err_ftp_path=`echo $err_ftp_info |awk -F ' ' '{print $5}'` src_file=`ls ./$time_path/$scr_file_path| sed 's/ /#@#/g'` success_file=`cat ./$time_path/${parser_log} |grep 'parser_success'|awk -F '|' '{print $3}'|sed 's/ /#@#/g'` err_files=`echo $success_file $src_file |sed 's/ /\n/g'|sort |uniq -u` if [ ${#err_files} -gt 0 ];then sh /data3/de_parser/de_tools/ds_ftp/makedir.sh $err_ftp_host $err_ftp_port $err_ftp_usr $err_ftp_pwd $err_ftp_path $date1 $time1 for err_file in $err_files do err_file_name=`echo $err_file|sed 's/#@#/ /g'` echo "t_err_file,$err_ftp_path/$date1/$time1,"${err_file_name}",$err_ftp_id" sh /data3/de_parser/de_tools/ds_ftp/msingle_put.sh $err_ftp_host $err_ftp_port $err_ftp_usr $err_ftp_pwd ./$time_path/$scr_file_path "$err_file_name" $err_ftp_path/$date1/$time1 done fi 帮我解释分析脚本
10-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值