Search in sources :

Example 26 with SQLSelectQuery

use of com.alibaba.druid.sql.ast.statement.SQLSelectQuery in project druid by alibaba.

the class SQLSelectParser method parseTableSource.

public SQLTableSource parseTableSource() {
    if (lexer.token() == Token.LPAREN) {
        lexer.nextToken();
        SQLTableSource tableSource;
        if (lexer.token() == Token.SELECT || lexer.token() == Token.WITH || lexer.token == Token.SEL) {
            SQLSelect select = select();
            accept(Token.RPAREN);
            SQLSelectQuery query = queryRest(select.getQuery());
            if (query instanceof SQLUnionQuery) {
                tableSource = new SQLUnionQueryTableSource((SQLUnionQuery) query);
            } else {
                tableSource = new SQLSubqueryTableSource(select);
            }
        } else if (lexer.token() == Token.LPAREN) {
            tableSource = parseTableSource();
            accept(Token.RPAREN);
        } else {
            tableSource = parseTableSource();
            accept(Token.RPAREN);
        }
        return parseTableSourceRest(tableSource);
    }
    if (lexer.token() == Token.SELECT) {
        throw new ParserException("TODO");
    }
    SQLExprTableSource tableReference = new SQLExprTableSource();
    parseTableSourceQueryTableExpr(tableReference);
    SQLTableSource tableSrc = parseTableSourceRest(tableReference);
    if (lexer.hasComment() && lexer.isKeepComments()) {
        tableSrc.addAfterComment(lexer.readAndResetComments());
    }
    return tableSrc;
}
Also used : SQLSubqueryTableSource(com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource) SQLSelect(com.alibaba.druid.sql.ast.statement.SQLSelect) SQLUnionQueryTableSource(com.alibaba.druid.sql.ast.statement.SQLUnionQueryTableSource) SQLUnionQuery(com.alibaba.druid.sql.ast.statement.SQLUnionQuery) SQLSelectQuery(com.alibaba.druid.sql.ast.statement.SQLSelectQuery) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource) SQLTableSource(com.alibaba.druid.sql.ast.statement.SQLTableSource)

Example 27 with SQLSelectQuery

use of com.alibaba.druid.sql.ast.statement.SQLSelectQuery in project druid by alibaba.

the class SQLSelectParser method queryRest.

public SQLSelectQuery queryRest(SQLSelectQuery selectQuery) {
    if (lexer.token() == Token.UNION) {
        lexer.nextToken();
        SQLUnionQuery union = createSQLUnionQuery();
        union.setLeft(selectQuery);
        if (lexer.token() == Token.ALL) {
            union.setOperator(SQLUnionOperator.UNION_ALL);
            lexer.nextToken();
        } else if (lexer.token() == Token.DISTINCT) {
            union.setOperator(SQLUnionOperator.DISTINCT);
            lexer.nextToken();
        }
        SQLSelectQuery right = this.query();
        union.setRight(right);
        return unionRest(union);
    }
    if (lexer.token() == Token.EXCEPT) {
        lexer.nextToken();
        SQLUnionQuery union = new SQLUnionQuery();
        union.setLeft(selectQuery);
        union.setOperator(SQLUnionOperator.EXCEPT);
        SQLSelectQuery right = this.query();
        union.setRight(right);
        return union;
    }
    if (lexer.token() == Token.INTERSECT) {
        lexer.nextToken();
        SQLUnionQuery union = new SQLUnionQuery();
        union.setLeft(selectQuery);
        union.setOperator(SQLUnionOperator.INTERSECT);
        SQLSelectQuery right = this.query();
        union.setRight(right);
        return union;
    }
    if (lexer.token() == Token.MINUS) {
        lexer.nextToken();
        SQLUnionQuery union = new SQLUnionQuery();
        union.setLeft(selectQuery);
        union.setOperator(SQLUnionOperator.MINUS);
        SQLSelectQuery right = this.query();
        union.setRight(right);
        return union;
    }
    return selectQuery;
}
Also used : SQLUnionQuery(com.alibaba.druid.sql.ast.statement.SQLUnionQuery) SQLSelectQuery(com.alibaba.druid.sql.ast.statement.SQLSelectQuery)

Example 28 with SQLSelectQuery

use of com.alibaba.druid.sql.ast.statement.SQLSelectQuery in project druid by alibaba.

the class SQLSelectParser method query.

public SQLSelectQuery query() {
    if (lexer.token() == Token.LPAREN) {
        lexer.nextToken();
        SQLSelectQuery select = query();
        accept(Token.RPAREN);
        return queryRest(select);
    }
    SQLSelectQueryBlock queryBlock = new SQLSelectQueryBlock();
    if (lexer.hasComment() && lexer.isKeepComments()) {
        queryBlock.addBeforeComment(lexer.readAndResetComments());
    }
    accept(Token.SELECT);
    if (lexer.token() == Token.COMMENT) {
        lexer.nextToken();
    }
    if (JdbcConstants.INFORMIX.equals(dbType)) {
        if (identifierEquals("SKIP")) {
            lexer.nextToken();
            SQLExpr offset = this.exprParser.primary();
            queryBlock.setOffset(offset);
        }
        if (identifierEquals("FIRST")) {
            lexer.nextToken();
            SQLExpr first = this.exprParser.primary();
            queryBlock.setFirst(first);
        }
    }
    if (lexer.token() == Token.DISTINCT) {
        queryBlock.setDistionOption(SQLSetQuantifier.DISTINCT);
        lexer.nextToken();
    } else if (lexer.token() == Token.UNIQUE) {
        queryBlock.setDistionOption(SQLSetQuantifier.UNIQUE);
        lexer.nextToken();
    } else if (lexer.token() == Token.ALL) {
        queryBlock.setDistionOption(SQLSetQuantifier.ALL);
        lexer.nextToken();
    }
    parseSelectList(queryBlock);
    parseFrom(queryBlock);
    parseWhere(queryBlock);
    parseGroupBy(queryBlock);
    parseFetchClause(queryBlock);
    return queryRest(queryBlock);
}
Also used : SQLSelectQuery(com.alibaba.druid.sql.ast.statement.SQLSelectQuery) SQLSelectQueryBlock(com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)

Example 29 with SQLSelectQuery

use of com.alibaba.druid.sql.ast.statement.SQLSelectQuery in project druid by alibaba.

the class DruidDataSource method oracleValidationQueryCheck.

private void oracleValidationQueryCheck() {
    if (validationQuery == null) {
        return;
    }
    if (validationQuery.length() == 0) {
        return;
    }
    SQLStatementParser sqlStmtParser = SQLParserUtils.createSQLStatementParser(validationQuery, this.dbType);
    List<SQLStatement> stmtList = sqlStmtParser.parseStatementList();
    if (stmtList.size() != 1) {
        return;
    }
    SQLStatement stmt = stmtList.get(0);
    if (!(stmt instanceof SQLSelectStatement)) {
        return;
    }
    SQLSelectQuery query = ((SQLSelectStatement) stmt).getSelect().getQuery();
    if (query instanceof SQLSelectQueryBlock) {
        if (((SQLSelectQueryBlock) query).getFrom() == null) {
            LOG.error("invalid oracle validationQuery. " + validationQuery + ", may should be : " + validationQuery + " FROM DUAL");
        }
    }
}
Also used : SQLStatementParser(com.alibaba.druid.sql.parser.SQLStatementParser) SQLSelectQuery(com.alibaba.druid.sql.ast.statement.SQLSelectQuery) SQLSelectStatement(com.alibaba.druid.sql.ast.statement.SQLSelectStatement) SQLSelectQueryBlock(com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement)

Example 30 with SQLSelectQuery

use of com.alibaba.druid.sql.ast.statement.SQLSelectQuery in project druid by alibaba.

the class DruidDataSource method db2ValidationQueryCheck.

private void db2ValidationQueryCheck() {
    if (validationQuery == null) {
        return;
    }
    if (validationQuery.length() == 0) {
        return;
    }
    SQLStatementParser sqlStmtParser = SQLParserUtils.createSQLStatementParser(validationQuery, this.dbType);
    List<SQLStatement> stmtList = sqlStmtParser.parseStatementList();
    if (stmtList.size() != 1) {
        return;
    }
    SQLStatement stmt = stmtList.get(0);
    if (!(stmt instanceof SQLSelectStatement)) {
        return;
    }
    SQLSelectQuery query = ((SQLSelectStatement) stmt).getSelect().getQuery();
    if (query instanceof SQLSelectQueryBlock) {
        if (((SQLSelectQueryBlock) query).getFrom() == null) {
            LOG.error("invalid db2 validationQuery. " + validationQuery + ", may should be : " + validationQuery + " FROM SYSDUMMY");
        }
    }
}
Also used : SQLStatementParser(com.alibaba.druid.sql.parser.SQLStatementParser) SQLSelectQuery(com.alibaba.druid.sql.ast.statement.SQLSelectQuery) SQLSelectStatement(com.alibaba.druid.sql.ast.statement.SQLSelectStatement) SQLSelectQueryBlock(com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement)

Aggregations

SQLSelectQuery (com.alibaba.druid.sql.ast.statement.SQLSelectQuery)31 SQLSelectStatement (com.alibaba.druid.sql.ast.statement.SQLSelectStatement)14 SQLSelectQueryBlock (com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock)13 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)10 MySqlSelectQueryBlock (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock)9 SQLSubqueryTableSource (com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource)8 SQLBinaryOpExpr (com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr)7 SQLSelectItem (com.alibaba.druid.sql.ast.statement.SQLSelectItem)7 SQLOrderBy (com.alibaba.druid.sql.ast.SQLOrderBy)6 SQLAggregateExpr (com.alibaba.druid.sql.ast.expr.SQLAggregateExpr)6 SQLSelect (com.alibaba.druid.sql.ast.statement.SQLSelect)6 SQLTableSource (com.alibaba.druid.sql.ast.statement.SQLTableSource)6 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)5 OracleSelectQueryBlock (com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock)5 SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)4 SQLIntegerExpr (com.alibaba.druid.sql.ast.expr.SQLIntegerExpr)4 SQLServerSelectQueryBlock (com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock)4 SQLLimit (com.alibaba.druid.sql.ast.SQLLimit)3 SQLAllColumnExpr (com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr)3 SQLBinaryOperator (com.alibaba.druid.sql.ast.expr.SQLBinaryOperator)3