Search in sources :

Example 46 with SQLIdentifierExpr

use of com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr in project druid by alibaba.

the class SQLDropDatabaseStatement method setServer.

public boolean setServer(String server) {
    if (database == null) {
        return false;
    }
    if (database instanceof SQLIdentifierExpr) {
        SQLPropertyExpr propertyExpr = new SQLPropertyExpr(new SQLIdentifierExpr(server), ((SQLIdentifierExpr) database).getName());
        propertyExpr.setParent(this);
        database = propertyExpr;
        return true;
    }
    if (database instanceof SQLPropertyExpr) {
        SQLPropertyExpr propertyExpr = (SQLPropertyExpr) database;
        SQLExpr owner = propertyExpr.getOwner();
        if (owner instanceof SQLIdentifierExpr) {
            propertyExpr.setOwner(new SQLIdentifierExpr(server));
            return true;
        } else if (owner instanceof SQLPropertyExpr) {
            ((SQLPropertyExpr) owner).setName(server);
            return true;
        }
    }
    return false;
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLPropertyExpr(com.alibaba.druid.sql.ast.expr.SQLPropertyExpr)

Example 47 with SQLIdentifierExpr

use of com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr in project druid by alibaba.

the class SQLShowColumnsStatement method setTable.

public void setTable(SQLName table) {
    if (table instanceof SQLPropertyExpr) {
        SQLPropertyExpr propExpr = (SQLPropertyExpr) table;
        this.setDatabase((SQLName) propExpr.getOwner());
        this.table = new SQLIdentifierExpr(propExpr.getName());
        return;
    }
    this.table = table;
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLPropertyExpr(com.alibaba.druid.sql.ast.expr.SQLPropertyExpr)

Example 48 with SQLIdentifierExpr

use of com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr in project druid by alibaba.

the class SQLExprTableSource method setSchema.

public void setSchema(String schema) {
    if (expr instanceof SQLPropertyExpr) {
        SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr;
        if (StringUtils.isEmpty(schema)) {
            this.setExpr(new SQLIdentifierExpr(propertyExpr.getName()));
        } else {
            propertyExpr.setOwner(schema);
        }
    } else {
        if (StringUtils.isEmpty(schema)) {
            return;
        }
        String ident = ((SQLIdentifierExpr) expr).getName();
        this.setExpr(new SQLPropertyExpr(schema, ident));
    }
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLPropertyExpr(com.alibaba.druid.sql.ast.expr.SQLPropertyExpr)

Example 49 with SQLIdentifierExpr

use of com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr in project druid by alibaba.

the class OdpsStatementParser method parsePrivileages.

protected void parsePrivileages(List<SQLPrivilegeItem> privileges, SQLObject parent) {
    for (; ; ) {
        String privilege = null;
        if (lexer.token() == Token.ALL) {
            lexer.nextToken();
            privilege = "ALL";
        } else if (lexer.token() == Token.SELECT) {
            privilege = "SELECT";
            lexer.nextToken();
        } else if (lexer.token() == Token.UPDATE) {
            privilege = "UPDATE";
            lexer.nextToken();
        } else if (lexer.token() == Token.DELETE) {
            privilege = "DELETE";
            lexer.nextToken();
        } else if (lexer.token() == Token.INSERT) {
            privilege = "INSERT";
            lexer.nextToken();
        } else if (lexer.token() == Token.DROP) {
            lexer.nextToken();
            privilege = "DROP";
        } else if (lexer.token() == Token.ALTER) {
            lexer.nextToken();
            privilege = "ALTER";
        } else if (lexer.identifierEquals("DESCRIBE")) {
            privilege = "DESCRIBE";
            lexer.nextToken();
        } else if (lexer.identifierEquals("READ")) {
            privilege = "READ";
            lexer.nextToken();
        } else if (lexer.identifierEquals("WRITE")) {
            privilege = "WRITE";
            lexer.nextToken();
        } else if (lexer.identifierEquals("EXECUTE")) {
            lexer.nextToken();
            privilege = "EXECUTE";
        } else if (lexer.identifierEquals("LIST")) {
            lexer.nextToken();
            privilege = "LIST";
        } else if (lexer.identifierEquals("CreateTable")) {
            lexer.nextToken();
            privilege = "CreateTable";
        } else if (lexer.identifierEquals("CreateInstance")) {
            lexer.nextToken();
            privilege = "CreateInstance";
        } else if (lexer.identifierEquals("CreateFunction")) {
            lexer.nextToken();
            privilege = "CreateFunction";
        } else if (lexer.identifierEquals("CreateResource")) {
            lexer.nextToken();
            privilege = "CreateResource";
        } else if (lexer.identifierEquals("CreateJob")) {
            lexer.nextToken();
            privilege = "CreateJob";
        } else if (lexer.identifierEquals("CreateVolume")) {
            lexer.nextToken();
            privilege = "CreateVolume";
        } else if (lexer.identifierEquals("CreateOfflineModel")) {
            lexer.nextToken();
            privilege = "CreateOfflineModel";
        } else if (lexer.identifierEquals("CreateXflow")) {
            lexer.nextToken();
            privilege = "CreateXflow";
        }
        SQLExpr expr = null;
        if (privilege != null) {
            expr = new SQLIdentifierExpr(privilege);
        } else {
            expr = this.exprParser.expr();
        }
        SQLPrivilegeItem privilegeItem = new SQLPrivilegeItem();
        privilegeItem.setAction(expr);
        if (lexer.token() == Token.LPAREN) {
            lexer.nextToken();
            for (; ; ) {
                privilegeItem.getColumns().add(this.exprParser.name());
                if (lexer.token() == Token.COMMA) {
                    lexer.nextToken();
                    continue;
                }
                break;
            }
            accept(Token.RPAREN);
        }
        expr.setParent(parent);
        privileges.add(privilegeItem);
        if (lexer.token() == Token.COMMA) {
            lexer.nextToken();
            continue;
        }
        break;
    }
}
Also used : SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)

Example 50 with SQLIdentifierExpr

use of com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr in project druid by alibaba.

the class OdpsStatementParser method parseStatementListDialect.

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");
                    parsePrivileages(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.hash_lower();
            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();
        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("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(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);
    }
    return false;
}
Also used : HiveLoadDataStatement(com.alibaba.druid.sql.dialect.hive.stmt.HiveLoadDataStatement) HiveCreateFunctionStatement(com.alibaba.druid.sql.dialect.hive.stmt.HiveCreateFunctionStatement) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) SQLQueryExpr(com.alibaba.druid.sql.ast.expr.SQLQueryExpr)

Aggregations

SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)152 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)68 SQLPropertyExpr (com.alibaba.druid.sql.ast.expr.SQLPropertyExpr)45 SQLBinaryOpExpr (com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr)19 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)18 SQLExprTableSource (com.alibaba.druid.sql.ast.statement.SQLExprTableSource)17 SQLCharExpr (com.alibaba.druid.sql.ast.expr.SQLCharExpr)16 SQLIntegerExpr (com.alibaba.druid.sql.ast.expr.SQLIntegerExpr)16 SQLSelectItem (com.alibaba.druid.sql.ast.statement.SQLSelectItem)15 SQLSelectQueryBlock (com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)15 SQLAggregateExpr (com.alibaba.druid.sql.ast.expr.SQLAggregateExpr)14 MySqlStatementParser (com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser)13 SQLVariantRefExpr (com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr)11 SQLAssignItem (com.alibaba.druid.sql.ast.statement.SQLAssignItem)11 SQLMethodInvokeExpr (com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr)10 SQLColumnDefinition (com.alibaba.druid.sql.ast.statement.SQLColumnDefinition)10 MySqlSelectQueryBlock (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock)10 SQLAllColumnExpr (com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr)9 ArrayList (java.util.ArrayList)9 SQLName (com.alibaba.druid.sql.ast.SQLName)8