public boolean parseStatementListDialect()

in core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java [84:625]


    public boolean parseStatementListDialect(List<SQLStatement> statementList) {
        if (lexer.token() == Token.FROM) {
            SQLStatement stmt = this.parseInsert();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("ANALYZE")) {
            SQLStatement stmt = parseAnalyze();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("ADD")) {
            lexer.nextToken();

            if (lexer.identifierEquals("STATISTIC")) {
                lexer.nextToken();
                OdpsAddStatisticStatement stmt = new OdpsAddStatisticStatement();
                stmt.setTable(this.exprParser.name());
                stmt.setStatisticClause(parseStaticClause());
                statementList.add(stmt);
                return true;
            }

            if (lexer.token() == Token.USER) {
                lexer.nextToken();
                OdpsAddUserStatement stmt = new OdpsAddUserStatement();
                stmt.setUser(this.exprParser.name());
                statementList.add(stmt);
                return true;
            }

            if (lexer.identifierEquals("ACCOUNTPROVIDER")) {
                lexer.nextToken();
                OdpsAddAccountProviderStatement stmt = new OdpsAddAccountProviderStatement();
                stmt.setProvider(this.exprParser.name());
                statementList.add(stmt);
                return true;
            }

            if (lexer.token() == Token.TABLE) {
                lexer.nextToken();
                OdpsAddTableStatement stmt = new OdpsAddTableStatement();
                stmt.setTable(this.exprParser.name());

                if (lexer.token() == Token.PARTITION) {
                    lexer.nextToken();
                    this.exprParser.parseAssignItem(stmt.getPartitions(), stmt);
                }

                if (lexer.token() == Token.AS) {
                    lexer.nextToken();
                    SQLName name = this.exprParser.name();
                    stmt.getTable().setAlias(name.toString());
                }

                if (lexer.token() == Token.COMMENT) {
                    lexer.nextToken();
                    stmt.setComment(this.exprParser.primary());
                }

                if (lexer.token() == Token.SUB) {
                    lexer.nextToken();
                    acceptIdentifier("f");
                    stmt.setForce(true);
                }

                if (lexer.token() == Token.TO) {
                    lexer.nextToken();
                    acceptIdentifier("PACKAGE");
                    SQLName packageName = this.exprParser.name();
                    stmt.setToPackage(packageName);

                    if (lexer.token() == Token.WITH) {
                        lexer.nextToken();
                        acceptIdentifier("PRIVILEGES");
                        parsePrivilege(stmt.getPrivileges(), stmt);
                    }
                }

                statementList.add(stmt);
                return true;
            }

            if (lexer.identifierEquals(FnvHash.Constants.FILE)
                    || lexer.identifierEquals(FnvHash.Constants.JAR)
                    || lexer.identifierEquals(FnvHash.Constants.PY)
                    || lexer.identifierEquals(FnvHash.Constants.ARCHIVE)) {
                OdpsAddFileStatement stmt = new OdpsAddFileStatement();

                long hash = lexer.hashLCase();
                if (hash == FnvHash.Constants.JAR) {
                    stmt.setType(OdpsAddFileStatement.FileType.JAR);
                } else if (hash == FnvHash.Constants.PY) {
                    stmt.setType(OdpsAddFileStatement.FileType.PY);
                } else if (hash == FnvHash.Constants.ARCHIVE) {
                    stmt.setType(OdpsAddFileStatement.FileType.ARCHIVE);
                }

                lexer.nextPath();
                String path = lexer.stringVal();

                lexer.nextToken();

                stmt.setFile(path);

                if (lexer.token() == Token.AS) {
                    lexer.nextToken();
                    SQLName name = this.exprParser.name();
                    stmt.setAlias(name.toString());
                }

                if (lexer.token() == Token.COMMENT) {
                    lexer.nextToken();
                    stmt.setComment(this.exprParser.primary());
                }

                if (lexer.token() == Token.SUB) {
                    lexer.nextToken();
                    acceptIdentifier("f");
                    stmt.setForce(true);
                }
                statementList.add(stmt);
                return true;
            }

            throw new ParserException("TODO " + lexer.info());
        }

        if (lexer.identifierEquals("REMOVE")) {
            lexer.nextToken();

            if (lexer.identifierEquals("STATISTIC")) {
                lexer.nextToken();
                OdpsRemoveStatisticStatement stmt = new OdpsRemoveStatisticStatement();
                stmt.setTable(this.exprParser.name());
                stmt.setStatisticClause(parseStaticClause());
                statementList.add(stmt);
                return true;
            }

            if (lexer.token() == Token.USER) {
                lexer.nextToken();
                OdpsRemoveUserStatement stmt = new OdpsRemoveUserStatement();
                stmt.setUser((SQLIdentifierExpr) this.exprParser.name());
                statementList.add(stmt);
                return true;
            }

            throw new ParserException("TODO " + lexer.info());
        }

        if (lexer.identifierEquals("READ")) {
            OdpsReadStatement stmt = new OdpsReadStatement();

            if (lexer.hasComment() && lexer.isKeepComments()) {
                stmt.addBeforeComment(lexer.readAndResetComments());
            }
            lexer.nextToken();

            stmt.setTable(this.exprParser.name());

            if (lexer.token() == Token.LPAREN) {
                lexer.nextToken();
                this.exprParser.names(stmt.getColumns(), stmt);
                accept(Token.RPAREN);
            }

            if (lexer.token() == Token.PARTITION) {
                lexer.nextToken();

                accept(Token.LPAREN);
                parseAssignItems(stmt.getPartition(), stmt);
                accept(Token.RPAREN);
            }

            if (lexer.token() == Token.LITERAL_INT) {
                stmt.setRowCount(this.exprParser.primary());
            }

            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("LIST")) {
            OdpsListStmt stmt = new OdpsListStmt();

            lexer.nextToken();
            stmt.setObject(this.exprParser.expr());

            if (lexer.identifierEquals("ROLES")
                    && stmt.getObject() instanceof SQLIdentifierExpr && ((SQLIdentifierExpr) stmt.getObject()).nameEquals("TENANT")) {
                lexer.nextToken();
                stmt.setObject(new SQLIdentifierExpr("TENANT ROLES"));
            } else if (lexer.identifierEquals("OUTPUT")
                    && stmt.getObject() instanceof SQLIdentifierExpr && ((SQLIdentifierExpr) stmt.getObject()).nameEquals("TEMPORARY")) {
                lexer.nextToken();
                stmt.setObject(new SQLIdentifierExpr("TEMPORARY OUTPUT"));
            }

            statementList.add(stmt);

            return true;
        }

        if (lexer.token() == Token.DESC || lexer.identifierEquals("DESCRIBE")) {
            SQLStatement stmt = parseDescribe();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("WHOAMI")) {
            lexer.nextToken();
            SQLWhoamiStatement stmt = new SQLWhoamiStatement();
            stmt.setDbType(DbType.odps);
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("COUNT")) {
            lexer.nextToken();
            OdpsCountStatement stmt = new OdpsCountStatement();
            stmt.setTable(this.exprParser.name());

            if (lexer.token() == Token.PARTITION) {
                lexer.nextToken();
                this.exprParser.parseAssignItem(stmt.getPartitions(), stmt);
            }
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("MSCK")) {
            SQLStatement stmt = parseMsck();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("alias")) {
            SQLStatement stmt = parseSet();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("EXSTORE")) {
            lexer.nextToken();
            OdpsExstoreStatement stmt = new OdpsExstoreStatement();
            SQLExpr table = this.exprParser.expr();
            stmt.setTable(new SQLExprTableSource(table));
            accept(Token.PARTITION);
            this.exprParser.parseAssignItem(stmt.getPartitions(), stmt);
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("INSTALL")) {
            lexer.nextToken();
            acceptIdentifier("PACKAGE");
            OdpsInstallPackageStatement stmt = new OdpsInstallPackageStatement();
            stmt.setPackageName(
                    this.exprParser.name()
            );
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("PAI")) {
            lexer.nextToken();
            int semiPos = lexer.text.indexOf(';', lexer.pos());
            while (semiPos != -1 && semiPos + 2 < lexer.text.length()) {
                char next = lexer.text.charAt(semiPos + 1);
                if (next == '"' || next == '\'') {
                    semiPos = lexer.text.indexOf(';', semiPos + 1);
                    continue;
                }
                break;
            }
            String arguments;
            if (semiPos != -1) {
                int count = semiPos - lexer.pos();
                arguments = lexer.subString(lexer.pos(), count);
                lexer.reset(semiPos);
            } else {
                arguments = lexer.subString(lexer.pos());
                lexer.reset(lexer.text.length());
            }
            lexer.nextToken();

            OdpsPAIStmt stmt = new OdpsPAIStmt();
            stmt.setArguments(arguments);
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals("COPY")) {
            SQLStatement stmt = parseCopy();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.KILL)) {
            SQLStatement stmt = parseKill();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.LOAD)) {
            HiveLoadDataStatement stmt = parseLoad();

            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.MERGE)) {
            SQLStatement stmt = parseMerge();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.CLONE)) {
            SQLStatement stmt = parseClone();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.UNLOAD)) {
            SQLStatement stmt = parseUnload();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.BEGIN)) {
            SQLStatement stmt = parseBlock();
            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.RESTORE)) {
            lexer.nextToken();
            accept(Token.TABLE);
            OdpsRestoreStatement stmt = new OdpsRestoreStatement();
            stmt.setTable(this.exprParser.name());

            if (lexer.token() == Token.LPAREN) {
                this.exprParser.parseAssignItem(stmt.getProperties(), stmt);
            }

            if (lexer.token() == Token.PARTITION) {
                lexer.nextToken();
                this.exprParser.parseAssignItem(stmt.getPartitions(), stmt);
            }

            if (lexer.token() == Token.TO) {
                lexer.nextToken();
                acceptIdentifier("LSN");
                stmt.setTo(
                        this.exprParser.expr()
                );
            }

            if (lexer.token() == Token.AS) {
                lexer.nextToken();
                stmt.setAlias(
                        this.alias()
                );
            }

            statementList.add(stmt);
            return true;
        }

        if (lexer.identifierEquals(FnvHash.Constants.UNDO)) {
            lexer.nextToken();
            accept(Token.TABLE);
            OdpsUndoTableStatement stmt = new OdpsUndoTableStatement();
            stmt.setTable(
                    new SQLExprTableSource(
                            this.exprParser.name()
                    )
            );

            if (lexer.token() == Token.PARTITION) {
                lexer.nextToken();
                this.exprParser.parseAssignItem(stmt.getPartitions(), stmt);
            }
            accept(Token.TO);
            stmt.setTo(
                    this.exprParser.expr()
            );
            statementList.add(stmt);
            return true;
        }

        if (lexer.token() == Token.FUNCTION) {
            HiveCreateFunctionStatement stmt = (HiveCreateFunctionStatement) parseHiveCreateFunction();
            stmt.setDeclare(true);
            statementList.add(stmt);
            return true;
        }

        if (lexer.token() == Token.VARIANT && lexer.stringVal().startsWith("@")) {
            Lexer.SavePoint mark = lexer.mark();
            String variant = lexer.stringVal();
            lexer.nextToken();

            if (lexer.token() == Token.COLONEQ) {
                lexer.nextToken();

                boolean cache = false;
                if (lexer.identifierEquals(FnvHash.Constants.CACHE)) {
                    lexer.nextToken();
                    accept(Token.ON);
                    cache = true;
                }

                Lexer.SavePoint lpMark = null;
                if (lexer.token() == Token.LPAREN) {
                    lpMark = lexer.mark();
                    lexer.nextToken();
                }

                switch (lexer.token()) {
                    case LITERAL_INT:
                    case LITERAL_FLOAT:
                    case LITERAL_CHARS:
                    case LITERAL_ALIAS:
                    case IDENTIFIER:
                    case CASE:
                    case CAST:
                    case IF:
                    case VARIANT:
                    case REPLACE:
                    case NEW:
                    case SUB:
                    case TRUE:
                    case FALSE: {
                        if (lpMark != null) {
                            lexer.reset(lpMark);
                        }

                        SQLExpr expr = this.exprParser.expr();
                        SQLExprStatement stmt = new SQLExprStatement(
                                new SQLAssignItem(new SQLIdentifierExpr(variant), expr)
                        );
                        statementList.add(stmt);
                        return true;
                    }
                    default:
                        if (lpMark != null) {
                            lexer.reset(lpMark);
                        }

                        boolean paren = lexer.token() == Token.LPAREN;
                        Lexer.SavePoint parenMark = lexer.mark();
                        SQLSelect select;
                        try {
                            select = new OdpsSelectParser(this.exprParser)
                                    .select();
                        } catch (ParserException error) {
                            if (paren) {
                                lexer.reset(parenMark);
                                SQLExpr expr = this.exprParser.expr();
                                SQLExprStatement stmt = new SQLExprStatement(
                                        new SQLAssignItem(new SQLIdentifierExpr(variant), expr)
                                );
                                statementList.add(stmt);
                                return true;
                            }
                            throw error;
                        }
                        switch (lexer.token()) {
                            case GT:
                            case GTEQ:
                            case EQ:
                            case LT:
                            case LTEQ:
                                statementList.add(
                                        new SQLExprStatement(
                                                new SQLAssignItem(new SQLIdentifierExpr(variant),
                                                        this.exprParser.exprRest(new SQLQueryExpr(select))
                                                )
                                        )
                                );
                                return true;
                            default:
                                break;
                        }
                        SQLSelectStatement stmt = new SQLSelectStatement(select, dbType);

                        OdpsQueryAliasStatement aliasQueryStatement = new OdpsQueryAliasStatement(variant, stmt);
                        aliasQueryStatement.setCache(cache);
                        statementList.add(aliasQueryStatement);
                        return true;
                }
            }

            OdpsDeclareVariableStatement stmt = new OdpsDeclareVariableStatement();

            if (lexer.token() != Token.EQ && lexer.token() != Token.SEMI && lexer.token() != Token.EOF) {
                stmt.setDataType(
                        this.exprParser.parseDataType()
                );
            }

            if (lexer.token() == Token.EQ || lexer.token() == Token.COLONEQ) {
                lexer.nextToken();
                stmt.setInitValue(
                        this.exprParser.expr()
                );
            }

            if (lexer.token() == Token.SEMI) {
                lexer.nextToken();
            }
            statementList.add(stmt);
            return true;
        }

        if (lexer.token() == Token.IF) {
            SQLStatement stmt = parseIf();
            statementList.add(stmt);
            return true;
        }

        if (lexer.token() == Token.CODE) {
            Lexer.SavePoint mark = lexer.mark();
            lexer.nextToken();
            if (lexer.token() == Token.EOF || lexer.token() == Token.SEMI) {
                return true;
            }
            lexer.reset(mark);
        }

        if (identifierEquals("COST")) {
            SQLStatement stmt = parseCost();
            statementList.add(stmt);
            return true;
        }

        return false;
    }