private Pair tryGrammaticalAnalysisSqlColumnNames()

in client/migrationx/migrationx-transformer/src/main/java/com/aliyun/dataworks/migrationx/transformer/dataworks/converter/dolphinscheduler/v2/nodes/parameters/DataxParameterConverter.java [200:280]


    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);
    }