/** * Adds an expression to select statements. E.g. a simple column is an expression. * * @param select * @param expr */ public static void addExpression(Select select, final Expression expr) { select.getSelectBody().accept(new SelectVisitor() { @Override public void visit(PlainSelect plainSelect) { plainSelect.getSelectItems().add(new SelectExpressionItem(expr)); } @Override public void visit(SetOperationList setOpList) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } @Override public void visit(WithItem withItem) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } @Override public void visit(ValuesStatement aThis) { throw new UnsupportedOperationException(NOT_SUPPORTED_YET); } }); }
select.getSelectBody().accept(new SelectVisitor() {
/** * Adds a simple join to a select statement. The introduced join is returned for more * configuration settings on it (e.g. left join, right join). * * @param select * @param table * @param onExpression * @return */ public static Join addJoin(Select select, final Table table, final Expression onExpression) { if (select.getSelectBody() instanceof PlainSelect) { PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); List<Join> joins = plainSelect.getJoins(); if (joins == null) { joins = new ArrayList<Join>(); plainSelect.setJoins(joins); } Join join = new Join(); join.setRightItem(table); join.setOnExpression(onExpression); joins.add(join); return join; } throw new UnsupportedOperationException(NOT_SUPPORTED_YET); }
public void visit(Select select) { SelectDeParser selectDeParser = new SelectDeParser(); selectDeParser.setBuffer(buffer); ExpressionDeParser expressionDeParser = new ExpressionDeParser(selectDeParser, buffer); selectDeParser.setExpressionVisitor(expressionDeParser); if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) { buffer.append("WITH "); for (Iterator iter = select.getWithItemsList().iterator(); iter.hasNext();) { WithItem withItem = (WithItem)iter.next(); buffer.append(withItem); if (iter.hasNext()) buffer.append(","); buffer.append(" "); } } select.getSelectBody().accept(selectDeParser); }
@Override public void visit(Select select) { selectDeParser.setBuffer(buffer); expressionDeParser.setSelectVisitor(selectDeParser); expressionDeParser.setBuffer(buffer); selectDeParser.setExpressionVisitor(expressionDeParser); if (select.getWithItemsList() != null && !select.getWithItemsList().isEmpty()) { buffer.append("WITH "); for (Iterator<WithItem> iter = select.getWithItemsList().iterator(); iter.hasNext();) { WithItem withItem = iter.next(); withItem.accept(selectDeParser); if (iter.hasNext()) { buffer.append(","); } buffer.append(" "); } } select.getSelectBody().accept(selectDeParser); }
@Override public void visit(Select select) { if (select.getWithItemsList() != null) { for (WithItem withItem : select.getWithItemsList()) { withItem.accept(this); } } select.getSelectBody().accept(this); }
private void appendSelect(Upsert upsert) { buffer.append(" "); if (upsert.isUseSelectBrackets()) { buffer.append("("); } if (upsert.getSelect().getWithItemsList() != null) { buffer.append("WITH "); for (WithItem with : upsert.getSelect().getWithItemsList()) { with.accept(selectVisitor); } buffer.append(" "); } upsert.getSelect().getSelectBody().accept(selectVisitor); if (upsert.isUseSelectBrackets()) { buffer.append(")"); } }
/** * 执行 SQL 解析 * * @param statement JsqlParser Statement * @return */ public SqlInfo processParser(Statement statement) { if (statement instanceof Insert) { this.processInsert((Insert) statement); } else if (statement instanceof Select) { this.processSelectBody(((Select) statement).getSelectBody()); } else if (statement instanceof Update) { this.processUpdate((Update) statement); } else if (statement instanceof Delete) { this.processDelete((Delete) statement); } logger.debug("parser sql: " + statement.toString()); return SqlInfo.newInstance().setSql(statement.toString()); }
@Test void parser() throws Exception { Select select = (Select) CCJSqlParserUtil.parse("SELECT a,b,c FROM tableName t WHERE t.col = 9 and b=c LIMIT 3, ?"); PlainSelect ps = (PlainSelect) select.getSelectBody(); System.out.println(ps.getWhere().toString()); System.out.println(ps.getSelectItems().get(1).toString()); AndExpression e = (AndExpression) ps.getWhere(); System.out.println(e.getLeftExpression()); }
/** * convert to order by sql * * @param sql * @param orderBy * @return */ public static String converToOrderBySql(String sql, String orderBy) { //解析SQL Statement stmt = null; try { stmt = CCJSqlParserUtil.parse(sql); Select select = (Select) stmt; SelectBody selectBody = select.getSelectBody(); //处理body-去最外层order by List<OrderByElement> orderByElements = extraOrderBy(selectBody); String defaultOrderBy = PlainSelect.orderByToString(orderByElements); if (defaultOrderBy.indexOf('?') != -1) { throw new PageException("原SQL[" + sql + "]中的order by包含参数,因此不能使用OrderBy插件进行修改!"); } //新的sql sql = select.toString(); } catch (Throwable e) { throw new PageException("处理排序失败: " + e, e); } return sql + " order by " + orderBy; }
createView.getSelect().getSelectBody().accept(selectVisitor);
insert.getSelect().getSelectBody().accept(selectVisitor); if (insert.isUseSelectBrackets()) { buffer.append(")");
buffer.append("("); Select select = update.getSelect(); select.getSelectBody().accept(selectVisitor); buffer.append(")");
/** * 将sql转换为count查询 * * @param select */ public void sqlToCount(Select select, String name) { SelectBody selectBody = select.getSelectBody(); // 是否能简化count查询 List<SelectItem> COUNT_ITEM = new ArrayList<SelectItem>(); COUNT_ITEM.add(new SelectExpressionItem(new Column("count(" + name +")"))); if (selectBody instanceof PlainSelect && isSimpleCount((PlainSelect) selectBody)) { ((PlainSelect) selectBody).setSelectItems(COUNT_ITEM); } else { PlainSelect plainSelect = new PlainSelect(); SubSelect subSelect = new SubSelect(); subSelect.setSelectBody(selectBody); subSelect.setAlias(TABLE_ALIAS); plainSelect.setFromItem(subSelect); plainSelect.setSelectItems(COUNT_ITEM); select.setSelectBody(plainSelect); } }
/** * insert 语句处理 */ @Override public void processInsert(Insert insert) { if (tenantHandler.doTableFilter(insert.getTable().getName())) { // 过滤退出执行 return; } insert.getColumns().add(new Column(tenantHandler.getTenantIdColumn())); if (insert.getSelect() != null) { processPlainSelect((PlainSelect) insert.getSelect().getSelectBody(), true); } else if (insert.getItemsList() != null) { // fixed github pull/295 ItemsList itemsList = insert.getItemsList(); if (itemsList instanceof MultiExpressionList) { ((MultiExpressionList) itemsList).getExprList().forEach(el -> el.getExpressions().add(tenantHandler.getTenantId())); } else { ((ExpressionList) insert.getItemsList()).getExpressions().add(tenantHandler.getTenantId()); } } else { throw ExceptionUtils.mpe("Failed to process multiple-table update, please exclude the tableName or statementId"); } }
SelectBody selectBody = select.getSelectBody(); try {
if (!(lockableSelect.statement().getSelectBody() instanceof PlainSelect)) { throw new SQLException("non support this query when use control lock."); PlainSelect plainSelect = (PlainSelect) lockableSelect.statement().getSelectBody();
SelectBody selectBody = select.getSelectBody(); if (selectBody instanceof SetOperationList) { selectBody = wrapSetOperationList((SetOperationList) selectBody);
try { Select selectStatement = (Select) CCJSqlParserUtil.parse(sql); PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); Distinct distinct = plainSelect.getDistinct(); List<Expression> groupBy = plainSelect.getGroupByColumnReferences();
List<Join> joins = null; if (statement instanceof Select) { PlainSelect plainSelect = (PlainSelect) ((Select) statement).getSelectBody(); where = plainSelect.getWhere(); table = (Table) plainSelect.getFromItem();