public static void addSelectItem(SQLStatement stmt, SQLExpr expr, String alias, boolean first) { if (expr == null) { return; } if (stmt instanceof SQLSelectStatement) { SQLSelectQuery query = ((SQLSelectStatement) stmt).getSelect().getQuery(); if (query instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; addSelectItem(queryBlock, expr, alias, first); } else { throw new IllegalArgumentException("add condition not support " + stmt.getClass().getName()); } return; } throw new IllegalArgumentException("add selectItem not support " + stmt.getClass().getName()); }
private static boolean isMulti(SQLQueryExpr sqlExpr) { return sqlExpr.getSubQuery().getQuery() instanceof SQLUnionQuery; }
protected SQLSelectQueryBlock getQueryBlock() { SQLSelect select = getSQLSelect(); SQLSelectQuery query = select.getQuery(); if (query == null) { query = createSelectQueryBlock(); select.setQuery(query); } if (!(query instanceof SQLSelectQueryBlock)) { throw new IllegalStateException("not support from, class : " + query.getClass().getName()); } SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; return queryBlock; }
private static boolean limitQueryBlock(SQLSelect select, String dbType, int offset, int count, boolean check) { SQLSelectQuery query = select.getQuery(); if (query instanceof SQLUnionQuery) { SQLUnionQuery union = (SQLUnionQuery) query; return limitUnion(union, dbType, offset, count, check); } SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; if (JdbcConstants.MYSQL.equals(dbType) || // JdbcConstants.MARIADB.equals(dbType) || // JdbcConstants.H2.equals(dbType)) { return limitMySqlQueryBlock(queryBlock, dbType, offset, count, check); } if (JdbcConstants.POSTGRESQL.equals(dbType)) { return limitPostgreSQLQueryBlock((PGSelectQueryBlock) queryBlock, dbType, offset, count, check); } throw new UnsupportedOperationException(); }
public static boolean limit(SQLSelect select, String dbType, int offset, int count, boolean check) { SQLSelectQuery query = select.getQuery(); if (JdbcConstants.ORACLE.equals(dbType)) { return limitOracle(select, dbType, offset, count, check); } if (JdbcConstants.DB2.equals(dbType)) { return limitDB2(select, dbType, offset, count, check); } if (JdbcConstants.SQL_SERVER.equals(dbType) || JdbcUtils.JTDS.equals(dbType)) { return limitSQLServer(select, dbType, offset, count, check); } return limitQueryBlock(select, dbType, offset, count, check); }
public static SQLExpr unwrap(SQLExpr expr) { if (expr == null) { return null; } if (expr instanceof SQLQueryExpr) { SQLSelect select = ((SQLQueryExpr) expr).getSubQuery(); if (select == null) { return null; } if (select.getQuery() instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) select.getQuery(); if (queryBlock.getFrom() == null) { if (queryBlock.getSelectList().size() == 1) { return queryBlock.getSelectList().get(0).getExpr(); } } } } return expr; }
public Select parseSelect(SQLQueryExpr mySqlExpr) throws SqlParseException { MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) mySqlExpr.getSubQuery().getQuery(); Select select = parseSelect(query); return select; }
@Override public ResultSet executeQuery(MockStatementBase statement, String sql) throws SQLException { SQLStatementParser parser = new MySqlStatementParser(sql); List<SQLStatement> stmtList = parser.parseStatementList(); // if (stmtList.size() > 1) { throw new SQLException("not support multi-statment. " + sql); } if (stmtList.size() == 0) { throw new SQLException("executeQueryError : " + sql); } SQLStatement stmt = stmtList.get(0); if (stmt instanceof CobarShowStatus) { return showStatus(statement); } if (!(stmt instanceof SQLSelectStatement)) { throw new SQLException("executeQueryError : " + sql); } SQLSelect select = ((SQLSelectStatement) stmt).getSelect(); SQLSelectQuery query = select.getQuery(); if (query instanceof SQLSelectQueryBlock) { return executeQuery(statement, (SQLSelectQueryBlock) query); } throw new SQLException("TODO"); }
private Object[] getMethodValuesWithSubQueries(SQLMethodInvokeExpr method) throws SqlParseException { List<Object> values = new ArrayList<>(); for (SQLExpr innerExpr : method.getParameters()) { if (innerExpr instanceof SQLQueryExpr) { Select select = sqlParser.parseSelect((MySqlSelectQueryBlock) ((SQLQueryExpr) innerExpr).getSubQuery().getQuery()); values.add(new SubQueryExpression(select)); } else if (innerExpr instanceof SQLTextLiteralExpr) { values.add(((SQLTextLiteralExpr) innerExpr).getText()); } else { values.add(innerExpr); } } return values.toArray(); }
private static boolean isJoin(SQLQueryExpr sqlExpr,String sql) { MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) sqlExpr.getSubQuery().getQuery(); return query.getFrom() instanceof SQLJoinTableSource && ((SQLJoinTableSource) query.getFrom()).getJoinType() != SQLJoinTableSource.JoinType.COMMA && sql.toLowerCase().contains("join"); }
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"); } } }
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"); } } }
@Override public boolean visit(MySqlSelectQueryBlock x) { SQLOrderBy orderBy = x.getOrderBy(); SQLLimit limit = x.getLimit(); if (limit != null && (orderBy == null || orderBy.getItems().size() == 0)) { boolean subQueryHasOrderBy = false; SQLTableSource from = x.getFrom(); if (from instanceof SQLSubqueryTableSource) { SQLSubqueryTableSource subqueryTabSrc = (SQLSubqueryTableSource) from; SQLSelect select = subqueryTabSrc.getSelect(); if (select.getQuery() instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock subquery = (SQLSelectQueryBlock) select.getQuery(); if (subquery.getOrderBy() != null && subquery.getOrderBy().getItems().size() > 0) { subQueryHasOrderBy = true; } } } if (!subQueryHasOrderBy) { unorderedLimitCount++; } } return true; } }
public static void addCondition(SQLStatement stmt, SQLBinaryOperator op, SQLExpr condition, boolean left) { if (stmt instanceof SQLSelectStatement) { SQLSelectQuery query = ((SQLSelectStatement) stmt).getSelect().getQuery(); if (query instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; SQLExpr newCondition = buildCondition(op, condition, left, queryBlock.getWhere()); queryBlock.setWhere(newCondition); } else { throw new IllegalArgumentException("add condition not support " + stmt.getClass().getName()); } return; } if (stmt instanceof SQLDeleteStatement) { SQLDeleteStatement delete = (SQLDeleteStatement) stmt; SQLExpr newCondition = buildCondition(op, condition, left, delete.getWhere()); delete.setWhere(newCondition); return; } if (stmt instanceof SQLUpdateStatement) { SQLUpdateStatement update = (SQLUpdateStatement) stmt; SQLExpr newCondition = buildCondition(op, condition, left, update.getWhere()); update.setWhere(newCondition); return; } throw new IllegalArgumentException("add condition not support " + stmt.getClass().getName()); }
public SQLName getTableName() { if (this.tableSource instanceof SQLExprTableSource) { SQLExprTableSource exprTableSource = (SQLExprTableSource) this.tableSource; return (SQLName) exprTableSource.getExpr(); } if (tableSource instanceof SQLSubqueryTableSource) { SQLSelectQuery selectQuery = ((SQLSubqueryTableSource) tableSource).getSelect().getQuery(); if (selectQuery instanceof SQLSelectQueryBlock) { SQLTableSource subQueryTableSource = ((SQLSelectQueryBlock) selectQuery).getFrom(); if (subQueryTableSource instanceof SQLExprTableSource) { SQLExpr subQueryTableSourceExpr = ((SQLExprTableSource) subQueryTableSource).getExpr(); return (SQLName) subQueryTableSourceExpr; } } } return null; }
private static boolean hasTableSource(SQLTableSource x) { if (x == null) { return false; } if (x instanceof SQLExprTableSource) { SQLExpr fromExpr = ((SQLExprTableSource) x).getExpr(); if (fromExpr instanceof SQLName) { String name = fromExpr.toString(); name = form(name); if (name.equalsIgnoreCase("DUAL")) { return false; } } return true; } else if (x instanceof SQLJoinTableSource) { SQLJoinTableSource join = (SQLJoinTableSource) x; return hasTableSource(join.getLeft()) || hasTableSource(join.getRight()); } else if (x instanceof SQLSubqueryTableSource) { return hasTableSource(((SQLSubqueryTableSource) x).getSelect().getQuery()); } return false; }
public boolean visit(SQLSelect x) { SQLWithSubqueryClause with = x.getWithSubQuery(); if (with != null) { with.accept(this); } SQLSelectQuery query = x.getQuery(); if (query != null) { query.accept(this); } SQLOrderBy orderBy = x.getOrderBy(); if (orderBy != null) { accept(x.getOrderBy()); } return false; }
public boolean visit(SQLSelect x) { SQLWithSubqueryClause withSubQuery = x.getWithSubQuery(); if (withSubQuery != null) { withSubQuery.accept(this); println(); } printQuery(x.getQuery()); SQLOrderBy orderBy = x.getOrderBy(); if (orderBy != null) { println(); orderBy.accept(this); } if (x.getHintsSize() > 0) { printAndAccept(x.getHints(), ""); } return false; }
public boolean visit(SQLDeleteStatement x) { if (repository != null && x.getParent() == null) { repository.resolve(x); } setMode(x, Mode.Delete); if (x.getTableSource() instanceof SQLSubqueryTableSource) { SQLSelectQuery selectQuery = ((SQLSubqueryTableSource) x.getTableSource()).getSelect().getQuery(); if (selectQuery instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock subQueryBlock = ((SQLSelectQueryBlock) selectQuery); subQueryBlock.getWhere().accept(this); } } TableStat stat = getTableStat(x.getTableName()); stat.incrementDeleteCount(); accept(x.getWhere()); return false; }
public boolean visit(SQLSelect x) { SQLWithSubqueryClause with = x.getWithSubQuery(); if (with != null) { with.accept(this); println(); } SQLSelectQuery query = x.getQuery(); query.accept(this); if (x.getRestriction() != null) { println(); print("WITH "); x.getRestriction().accept(this); } SQLOrderBy orderBy = x.getOrderBy(); if (orderBy != null) { boolean hasFirst = false; if (query instanceof SQLSelectQueryBlock) { SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) query; hasFirst = queryBlock.getFirst() != null; } if (!hasFirst) { println(); orderBy.accept(this); } } return false; }