1919from sql .utils .tasks import add_kill_conn_schedule , del_schedule
2020from .models import QueryLog , Instance
2121from sql .engines import get_engine
22+ from sql .utils .sql_utils import SqlglotUtils
2223
2324logger = logging .getLogger ("default" )
2425
@@ -36,6 +37,7 @@ def query(request):
3637 tb_name = request .POST .get ("tb_name" )
3738 limit_num = int (request .POST .get ("limit_num" , 0 ))
3839 schema_name = request .POST .get ("schema_name" , None )
40+ is_offline_export = int (request .POST .get ("is_offline_export" , 0 ))
3941 user = request .user
4042
4143 result = {"status" : 0 , "msg" : "ok" , "data" : {}}
@@ -68,6 +70,7 @@ def query(request):
6870 result ["msg" ] = query_check_info .get ("msg" )
6971 return HttpResponse (json .dumps (result ), content_type = "application/json" )
7072 sql_content = query_check_info ["filtered_sql" ]
73+ original_sql = sql_content .strip ()
7174
7275 # 查询权限校验,并且获取limit_num
7376 priv_check_info = query_priv_check (
@@ -82,9 +85,22 @@ def query(request):
8285 return HttpResponse (json .dumps (result ), content_type = "application/json" )
8386 # explain的limit_num设置为0
8487 limit_num = 0 if re .match (r"^explain" , sql_content .lower ()) else limit_num
85-
86- # 对查询sql增加limit限制或者改写语句
87- sql_content = query_engine .filter_sql (sql = sql_content , limit_num = limit_num )
88+ dialect = SqlglotUtils .get_dialect (instance .db_type )
89+ if is_offline_export :
90+ # 离线导出,统计总数,需要包装count查询语句
91+ sql_content = SqlglotUtils .wrap_query_with_count (sql_content , dialect )
92+ else :
93+ # 页面查询,增加行数限制
94+ # 支持sqlglot方言转换的,使用方言添加行数限制
95+ if dialect :
96+ sql_content = SqlglotUtils .add_limit_to_query (
97+ sql_content , limit_num , dialect
98+ )
99+ else :
100+ # 不支持sqlglot方言的,使用引擎filter_sql函数处理
101+ sql_content = query_engine .filter_sql (
102+ sql = sql_content , limit_num = limit_num
103+ )
88104
89105 # 先获取查询连接,用于后面查询复用连接以及终止会话
90106 query_engine .get_connection (db_name = db_name )
@@ -176,6 +192,7 @@ def query(request):
176192 db_name = db_name ,
177193 instance_name = instance .instance_name ,
178194 sqllog = sql_content ,
195+ original_sql = original_sql ,
179196 effect_row = limit_num ,
180197 cost_time = query_result .query_time ,
181198 priv_check = priv_check ,
@@ -273,6 +290,7 @@ def _querylog(request):
273290 "instance_name" ,
274291 "db_name" ,
275292 "sqllog" ,
293+ "original_sql" ,
276294 "effect_row" ,
277295 "cost_time" ,
278296 "user_display" ,
0 commit comments