|
|
|
@ -711,6 +711,8 @@ async def generate_sql(tablesRowCol:dict, table_columns:dict): |
|
|
|
|
|
|
|
# return oldStrSql |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def replace_table_with_subquery(ctrSqlDict, oldStrSql): |
|
|
|
""" |
|
|
|
将 SQL 中的表替换成子查询,并自动生成别名,同时把字段引用替换为别名.字段 |
|
|
|
@ -733,35 +735,23 @@ async def replace_table_with_subquery(ctrSqlDict, oldStrSql): |
|
|
|
alias_part = match.group(3) # " AS xxx" 或 " xxx" |
|
|
|
alias_name = match.group(4) # xxx |
|
|
|
|
|
|
|
if original_table not in table_alias_map: |
|
|
|
# 判断 alias 是否为关键字 |
|
|
|
# 判断 alias 是否为关键字 |
|
|
|
# 动态获取子查询 |
|
|
|
if original_table in ctrSqlDict: |
|
|
|
# 使用 ctrSqlDict 中的子查询替换表名 |
|
|
|
replaced = f"{keyword} ({ctrSqlDict[original_table]}) {alias_part}" |
|
|
|
else: |
|
|
|
# 默认处理逻辑:判断 alias 是否为关键字 |
|
|
|
sql_keywords = { |
|
|
|
# 数据操作关键字 |
|
|
|
"SELECT", "INSERT", "UPDATE", "DELETE", "MERGE", "TRUNCATE", |
|
|
|
"VALUES", "RETURNING", |
|
|
|
|
|
|
|
# 查询关键字 |
|
|
|
"FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LIMIT", "OFFSET", |
|
|
|
"DISTINCT", "ALL", "UNION", "INTERSECT", "EXCEPT", |
|
|
|
|
|
|
|
# 连接关键字 |
|
|
|
"VALUES", "RETURNING", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", |
|
|
|
"LIMIT", "OFFSET", "DISTINCT", "ALL", "UNION", "INTERSECT", "EXCEPT", |
|
|
|
"JOIN", "INNER", "LEFT", "RIGHT", "FULL", "CROSS", "NATURAL", "USING", "ON", |
|
|
|
|
|
|
|
# 数据类型和约束关键字 |
|
|
|
"TABLE", "VIEW", "INDEX", "PRIMARY", "KEY", "FOREIGN", "REFERENCES", |
|
|
|
"NOT", "NULL", "UNIQUE", "CHECK", "DEFAULT", |
|
|
|
|
|
|
|
# 控制关键字 |
|
|
|
"IF", "ELSE", "CASE", "WHEN", "THEN", "END", "LOOP", "FOR", "WHILE", |
|
|
|
|
|
|
|
# 其他 |
|
|
|
"CREATE", "ALTER", "DROP", "TRUNCATE", "COMMENT", |
|
|
|
"EXISTS", "IN", "IS", "LIKE", "ILIKE", "SIMILAR", "BETWEEN", |
|
|
|
"AND", "OR", "ANY", "ALL", "SOME", |
|
|
|
"FETCH", "NEXT", "ONLY", "ASC", "DESC", |
|
|
|
"GRANT", "REVOKE", "ROLE", "USER", |
|
|
|
"CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", |
|
|
|
"TABLE", "VIEW", "INDEX", "PRIMARY", "KEY", "FOREIGN", "REFERENCES", "NOT", |
|
|
|
"NULL", "UNIQUE", "CHECK", "DEFAULT", "IF", "ELSE", "CASE", "WHEN", "THEN", |
|
|
|
"END", "LOOP", "FOR", "WHILE", "CREATE", "ALTER", "DROP", "TRUNCATE", "COMMENT", |
|
|
|
"EXISTS", "IN", "IS", "LIKE", "ILIKE", "SIMILAR", "BETWEEN", "AND", "OR", "ANY", |
|
|
|
"ALL", "SOME", "FETCH", "NEXT", "ONLY", "ASC", "DESC", "GRANT", "REVOKE", "ROLE", |
|
|
|
"USER", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", |
|
|
|
} |
|
|
|
|
|
|
|
if alias_name and alias_name.upper().split()[0] not in sql_keywords: |
|
|
|
@ -771,9 +761,6 @@ async def replace_table_with_subquery(ctrSqlDict, oldStrSql): |
|
|
|
alias = original_table.split('.')[-1] |
|
|
|
replaced = f"{keyword} ({subquery}) AS {alias}{alias_part or ''}" |
|
|
|
table_alias_map[original_table] = alias |
|
|
|
else: |
|
|
|
alias = table_alias_map[original_table] |
|
|
|
replaced = f"{keyword} {alias}" |
|
|
|
|
|
|
|
return replaced |
|
|
|
|
|
|
|
@ -791,8 +778,6 @@ async def replace_table_with_subquery(ctrSqlDict, oldStrSql): |
|
|
|
|
|
|
|
return oldStrSql |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def get_data_source_tree(request: Request, current_user: MetaSecurityApiModel): |
|
|
|
|
|
|
|
url = f'{AppConfig.ds_server_url}/dolphinscheduler/datasources/withpwdlist?pageNo=1&pageSize=100' |
|
|
|
|