Skip to content

Commit 6a35aab

Browse files
committed
增加标识变量parentIsInsert,并优化代码,修改命名
1 parent 1485ceb commit 6a35aab

File tree

1 file changed

+31
-11
lines changed

1 file changed

+31
-11
lines changed

core/src/main/java/com/dtstack/flink/sql/parser/InsertSqlParser.java

+31-11
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@
5050

5151
public class InsertSqlParser implements IParser {
5252

53+
// 用来标识当前解析节点的上一层节点是否为 insert 节点
54+
private static Boolean parentIsInsert = false;
55+
5356
@Override
5457
public boolean verify(String sql) {
5558
return StringUtils.isNotBlank(sql) && sql.trim().toLowerCase().startsWith("insert");
@@ -79,24 +82,19 @@ private static void parseNode(SqlNode sqlNode, SqlParseResult sqlParseResult){
7982
SqlNode sqlTarget = ((SqlInsert)sqlNode).getTargetTable();
8083
SqlNode sqlSource = ((SqlInsert)sqlNode).getSource();
8184
sqlParseResult.addTargetTable(sqlTarget.toString());
85+
parentIsInsert = true;
8286
parseNode(sqlSource, sqlParseResult);
8387
break;
8488
case SELECT:
8589
SqlSelect sqlSelect = (SqlSelect) sqlNode;
86-
SqlNodeList selectList = sqlSelect.getSelectList();
87-
SqlNodeList sqlNodes = new SqlNodeList(selectList.getParserPosition());
88-
for (int index = 0; index < selectList.size(); index++) {
89-
if (selectList.get(index).getKind().equals(SqlKind.AS)) {
90-
sqlNodes.add(selectList.get(index));
91-
continue;
92-
}
93-
sqlNodes.add(transformToSqlBasicCall(selectList.get(index)));
90+
if (parentIsInsert) {
91+
rebuildSelectNode(sqlSelect.getSelectList(), sqlSelect);
9492
}
95-
sqlSelect.setSelectList(sqlNodes);
9693
SqlNode sqlFrom = ((SqlSelect) sqlNode).getFrom();
9794
if (sqlFrom.getKind() == IDENTIFIER) {
9895
sqlParseResult.addSourceTable(sqlFrom.toString());
9996
} else {
97+
parentIsInsert = false;
10098
parseNode(sqlFrom, sqlParseResult);
10199
}
102100
break;
@@ -153,8 +151,30 @@ private static void parseNode(SqlNode sqlNode, SqlParseResult sqlParseResult){
153151
}
154152
}
155153

156-
// 将 sqlNode 转换为 SqlBasicCall
157-
public static SqlBasicCall transformToSqlBasicCall(SqlNode sqlNode) {
154+
/**
155+
* 将第一层 select 中的 sqlNode 转化为 AsNode,解决字段名冲突问题
156+
* @param selectList select Node 的 select 字段
157+
* @param sqlSelect 第一层解析出来的 selectNode
158+
*/
159+
private static void rebuildSelectNode(SqlNodeList selectList, SqlSelect sqlSelect) {
160+
SqlNodeList sqlNodes = new SqlNodeList(selectList.getParserPosition());
161+
162+
for (int index = 0; index < selectList.size(); index++) {
163+
if (selectList.get(index).getKind().equals(SqlKind.AS)) {
164+
sqlNodes.add(selectList.get(index));
165+
continue;
166+
}
167+
sqlNodes.add(transformToAsNode(selectList.get(index)));
168+
}
169+
sqlSelect.setSelectList(sqlNodes);
170+
}
171+
172+
/**
173+
* 将 sqlNode 转化为 AsNode
174+
* @param sqlNode 需要转化的 sqlNode
175+
* @return 重新构造的 AsNode
176+
*/
177+
public static SqlBasicCall transformToAsNode(SqlNode sqlNode) {
158178
String asName = "";
159179
SqlParserPos pos = new SqlParserPos(sqlNode.getParserPosition().getLineNum(),
160180
sqlNode.getParserPosition().getEndColumnNum());

0 commit comments

Comments
 (0)