in client/migrationx/migrationx-transformer/src/main/java/com/aliyun/dataworks/migrationx/transformer/dataworks/converter/dolphinscheduler/v1/workflow/parameters/DataxParameterConverter.java [219:299]
private Pair<String, String[]> tryGrammaticalAnalysisSqlColumnNames(DbType dbType, String sql) {
String[] columnNames;
String sourceTable = null;
try {
SQLStatementParser parser = DataxUtils.getSqlStatementParser(dbType, sql);
if (parser == null) {
log.warn("database driver [{}] is not support grammatical analysis sql", dbType);
return Pair.of(null, new String[0]);
}
SQLStatement sqlStatement = parser.parseStatement();
SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) sqlStatement;
SQLSelect sqlSelect = sqlSelectStatement.getSelect();
List<SQLSelectItem> selectItemList = null;
if (sqlSelect.getQuery() instanceof SQLSelectQueryBlock) {
SQLSelectQueryBlock block = (SQLSelectQueryBlock) sqlSelect.getQuery();
selectItemList = block.getSelectList();
if (block.getFrom() instanceof SQLExprTableSource) {
SQLExprTableSource expr = (SQLExprTableSource) block.getFrom();
if (expr.getExpr() instanceof SQLIdentifierExpr) {
sourceTable = ((SQLIdentifierExpr) expr.getExpr()).getName();
}
}
} else if (sqlSelect.getQuery() instanceof SQLUnionQuery) {
SQLUnionQuery unionQuery = (SQLUnionQuery) sqlSelect.getQuery();
SQLSelectQueryBlock block = (SQLSelectQueryBlock) unionQuery.getRight();
selectItemList = block.getSelectList();
if (block.getFrom() instanceof SQLExprTableSource) {
SQLExprTableSource expr = (SQLExprTableSource) block.getFrom();
if (expr.getExpr() instanceof SQLIdentifierExpr) {
sourceTable = ((SQLIdentifierExpr) expr.getExpr()).getName();
}
}
}
if (selectItemList == null) {
throw new RuntimeException(String.format("select query type [%s] is not support", sqlSelect.getQuery().toString()));
}
columnNames = new String[selectItemList.size()];
for (int i = 0; i < selectItemList.size(); i++) {
SQLSelectItem item = selectItemList.get(i);
String columnName = null;
if (item.getAlias() != null) {
columnName = item.getAlias();
} else if (item.getExpr() != null) {
if (item.getExpr() instanceof SQLPropertyExpr) {
SQLPropertyExpr expr = (SQLPropertyExpr) item.getExpr();
columnName = expr.getName();
} else if (item.getExpr() instanceof SQLIdentifierExpr) {
SQLIdentifierExpr expr = (SQLIdentifierExpr) item.getExpr();
columnName = expr.getName();
}
} else {
throw new RuntimeException(
String.format("grammatical analysis sql column [ %s ] failed", item));
}
if (SELECT_ALL_CHARACTER.equals(item.toString())) {
log.info("sql contains *, grammatical analysis failed");
return Pair.of(sourceTable, new String[]{"*"});
}
if (columnName == null) {
throw new RuntimeException(
String.format("grammatical analysis sql column [ %s ] failed", item));
}
columnNames[i] = columnName;
}
} catch (Exception e) {
log.warn(e.getMessage(), e);
return Pair.of(null, new String[0]);
}
return Pair.of(sourceTable, columnNames);
}