use of com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr in project druid by alibaba.
the class EqualTest_inquery_mysql method test_exits.
public void test_exits() throws Exception {
String sql = "fstate in (select state from t_status)";
String sql_c = "fstate_c in (select state from t_status)";
SQLInSubQueryExpr exprA, exprB, exprC;
{
SQLExprParser parser = new SQLExprParser(sql);
exprA = (SQLInSubQueryExpr) parser.expr();
}
{
SQLExprParser parser = new SQLExprParser(sql);
exprB = (SQLInSubQueryExpr) parser.expr();
}
{
SQLExprParser parser = new SQLExprParser(sql_c);
exprC = (SQLInSubQueryExpr) parser.expr();
}
Assert.assertEquals(exprA, exprB);
Assert.assertNotEquals(exprA, exprC);
Assert.assertTrue(exprA.equals(exprA));
Assert.assertFalse(exprA.equals(new Object()));
Assert.assertEquals(exprA.hashCode(), exprB.hashCode());
Assert.assertEquals(new SQLInSubQueryExpr(), new SQLInSubQueryExpr());
Assert.assertEquals(new SQLInSubQueryExpr().hashCode(), new SQLInSubQueryExpr().hashCode());
}
use of com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr in project druid by alibaba.
the class WallVisitorUtils method isFirstInSubQuery.
private static boolean isFirstInSubQuery(SQLObject x) {
for (; ; ) {
if (x instanceof SQLExpr) {
x = x.getParent();
} else {
break;
}
}
if (!(x instanceof SQLExprTableSource)) {
return false;
}
SQLSelect sqlSelect = null;
SQLObject parent = x.getParent();
while (parent != null) {
if (parent instanceof SQLSelect) {
sqlSelect = (SQLSelect) parent;
break;
}
x = parent;
parent = x.getParent();
}
if (sqlSelect == null) {
return false;
}
parent = sqlSelect.getParent();
if (!(parent instanceof SQLInSubQueryExpr && isFirst(parent))) {
return false;
}
SQLInSubQueryExpr sqlInSubQueryExpr = (SQLInSubQueryExpr) parent;
if (!(sqlInSubQueryExpr.getParent() instanceof SQLSelectQueryBlock)) {
return false;
}
SQLSelectQueryBlock queryBlock = (SQLSelectQueryBlock) sqlInSubQueryExpr.getParent();
if (!(queryBlock.getParent() instanceof SQLSelect)) {
return false;
}
SQLSelect select = (SQLSelect) queryBlock.getParent();
if (!(select.getParent() instanceof SQLSelectStatement)) {
return false;
}
SQLSelectStatement stmt = (SQLSelectStatement) select.getParent();
return stmt.getParent() == null;
}
use of com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr in project druid by alibaba.
the class WallVisitorUtils method isFirstSelectTableSource.
private static boolean isFirstSelectTableSource(SQLObject x) {
for (; ; ) {
if (x instanceof SQLExpr) {
x = x.getParent();
} else {
break;
}
}
if (!(x instanceof SQLExprTableSource)) {
return false;
}
SQLSelectQueryBlock queryBlock = null;
SQLObject parent = x.getParent();
while (parent != null) {
if (parent instanceof SQLSelectQueryBlock) {
queryBlock = (SQLSelectQueryBlock) parent;
break;
}
x = parent;
parent = x.getParent();
}
if (queryBlock == null) {
return false;
}
boolean isWhereQueryExpr = false;
boolean isSelectItem = false;
do {
x = parent;
parent = parent.getParent();
if (parent instanceof SQLUnionQuery) {
SQLUnionQuery union = (SQLUnionQuery) parent;
if (union.getRight() == x && hasTableSource(union.getLeft())) {
return false;
}
} else if (parent instanceof SQLQueryExpr || parent instanceof SQLInSubQueryExpr || parent instanceof SQLExistsExpr) {
isWhereQueryExpr = isWhereOrHaving(parent);
} else if (parent instanceof SQLSelectItem) {
isSelectItem = true;
} else if ((isWhereQueryExpr || isSelectItem) && parent instanceof SQLSelectQueryBlock) {
if (hasTableSource((SQLSelectQueryBlock) parent)) {
return false;
}
}
} while (parent != null);
return true;
}
use of com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr in project Mycat_plus by coderczp.
the class MycatSchemaStatVisitor method visit.
/*
* 遇到 some 将子查询改写成 SELECT MIN(name) FROM subtest1
* 例如:
* select * from subtest where id > some (select name from subtest1);
* >/>= some ----> >/>= min
* </<= some ----> </<= max
* <> some ----> not in
* = some ----> in
* other 不改写
*/
@Override
public boolean visit(SQLSomeExpr x) {
setSubQueryRelationOrFlag(x);
List<SQLSelectItem> itemlist = ((SQLSelectQueryBlock) (x.getSubQuery().getQuery())).getSelectList();
SQLExpr sexpr = itemlist.get(0).getExpr();
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr parentExpr = (SQLBinaryOpExpr) x.getParent();
SQLAggregateExpr saexpr = null;
switch(parentExpr.getOperator()) {
case GreaterThan:
case GreaterThanOrEqual:
case NotLessThan:
this.hasChange = true;
if (sexpr instanceof SQLIdentifierExpr || (sexpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) sexpr).getOwner() instanceof SQLIdentifierExpr)) {
saexpr = new SQLAggregateExpr("MIN");
saexpr.getArguments().add(sexpr);
saexpr.setParent(itemlist.get(0));
itemlist.get(0).setExpr(saexpr);
}
SQLQueryExpr maxSubQuery = new SQLQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(maxSubQuery);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
if (((SQLBinaryOpExpr) x.getParent()).getLeft().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setLeft(maxSubQuery);
} else if (((SQLBinaryOpExpr) x.getParent()).getRight().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setRight(maxSubQuery);
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x.getSubQuery());
case LessThan:
case LessThanOrEqual:
case NotGreaterThan:
this.hasChange = true;
if (sexpr instanceof SQLIdentifierExpr || (sexpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) sexpr).getOwner() instanceof SQLIdentifierExpr)) {
saexpr = new SQLAggregateExpr("MAX");
saexpr.getArguments().add(sexpr);
saexpr.setParent(itemlist.get(0));
itemlist.get(0).setExpr(saexpr);
}
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
SQLQueryExpr minSubQuery = new SQLQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(minSubQuery);
if (x.getParent() instanceof SQLBinaryOpExpr) {
if (((SQLBinaryOpExpr) x.getParent()).getLeft().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setLeft(minSubQuery);
} else if (((SQLBinaryOpExpr) x.getParent()).getRight().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setRight(minSubQuery);
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x.getSubQuery());
case LessThanOrGreater:
case NotEqual:
this.hasChange = true;
SQLInSubQueryExpr notInSubQueryExpr = new SQLInSubQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(notInSubQueryExpr);
notInSubQueryExpr.setNot(true);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr xp = (SQLBinaryOpExpr) x.getParent();
if (xp.getLeft().equals(x)) {
notInSubQueryExpr.setExpr(xp.getRight());
} else if (xp.getRight().equals(x)) {
notInSubQueryExpr.setExpr(xp.getLeft());
}
if (xp.getParent() instanceof MySqlSelectQueryBlock) {
((MySqlSelectQueryBlock) xp.getParent()).setWhere(notInSubQueryExpr);
} else if (xp.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr pp = ((SQLBinaryOpExpr) xp.getParent());
if (pp.getLeft().equals(xp)) {
pp.setLeft(notInSubQueryExpr);
} else if (pp.getRight().equals(xp)) {
pp.setRight(notInSubQueryExpr);
}
}
}
addSubQuerys(x.getSubQuery());
return super.visit(notInSubQueryExpr);
case Equality:
this.hasChange = true;
SQLInSubQueryExpr inSubQueryExpr = new SQLInSubQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(inSubQueryExpr);
inSubQueryExpr.setNot(false);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr xp = (SQLBinaryOpExpr) x.getParent();
if (xp.getLeft().equals(x)) {
inSubQueryExpr.setExpr(xp.getRight());
} else if (xp.getRight().equals(x)) {
inSubQueryExpr.setExpr(xp.getLeft());
}
if (xp.getParent() instanceof MySqlSelectQueryBlock) {
((MySqlSelectQueryBlock) xp.getParent()).setWhere(inSubQueryExpr);
} else if (xp.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr pp = ((SQLBinaryOpExpr) xp.getParent());
if (pp.getLeft().equals(xp)) {
pp.setLeft(inSubQueryExpr);
} else if (pp.getRight().equals(xp)) {
pp.setRight(inSubQueryExpr);
}
}
}
addSubQuerys(x.getSubQuery());
return super.visit(inSubQueryExpr);
default:
break;
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x);
}
use of com.alibaba.druid.sql.ast.expr.SQLInSubQueryExpr in project Mycat_plus by coderczp.
the class MycatSchemaStatVisitor method visit.
/*
* 遇到 any 将子查询改写成 SELECT MIN(name) FROM subtest1
* 例如:
* select * from subtest where id oper any (select name from subtest1);
* >/>= any ----> >/>= min
* </<= any ----> </<= max
* <> any ----> not in
* = some ----> in
* other 不改写
*/
@Override
public boolean visit(SQLAnyExpr x) {
setSubQueryRelationOrFlag(x);
List<SQLSelectItem> itemlist = ((SQLSelectQueryBlock) (x.getSubQuery().getQuery())).getSelectList();
SQLExpr sexpr = itemlist.get(0).getExpr();
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr parentExpr = (SQLBinaryOpExpr) x.getParent();
SQLAggregateExpr saexpr = null;
switch(parentExpr.getOperator()) {
case GreaterThan:
case GreaterThanOrEqual:
case NotLessThan:
this.hasChange = true;
if (sexpr instanceof SQLIdentifierExpr || (sexpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) sexpr).getOwner() instanceof SQLIdentifierExpr)) {
saexpr = new SQLAggregateExpr("MIN");
saexpr.getArguments().add(sexpr);
saexpr.setParent(itemlist.get(0));
itemlist.get(0).setExpr(saexpr);
}
SQLQueryExpr maxSubQuery = new SQLQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(maxSubQuery);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
if (((SQLBinaryOpExpr) x.getParent()).getLeft().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setLeft(maxSubQuery);
} else if (((SQLBinaryOpExpr) x.getParent()).getRight().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setRight(maxSubQuery);
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x.getSubQuery());
case LessThan:
case LessThanOrEqual:
case NotGreaterThan:
this.hasChange = true;
if (sexpr instanceof SQLIdentifierExpr || (sexpr instanceof SQLPropertyExpr && ((SQLPropertyExpr) sexpr).getOwner() instanceof SQLIdentifierExpr)) {
saexpr = new SQLAggregateExpr("MAX");
saexpr.getArguments().add(sexpr);
saexpr.setParent(itemlist.get(0));
itemlist.get(0).setExpr(saexpr);
}
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
SQLQueryExpr minSubQuery = new SQLQueryExpr(x.getSubQuery());
x.subQuery.setParent(minSubQuery);
if (x.getParent() instanceof SQLBinaryOpExpr) {
if (((SQLBinaryOpExpr) x.getParent()).getLeft().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setLeft(minSubQuery);
} else if (((SQLBinaryOpExpr) x.getParent()).getRight().equals(x)) {
((SQLBinaryOpExpr) x.getParent()).setRight(minSubQuery);
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x.getSubQuery());
case LessThanOrGreater:
case NotEqual:
this.hasChange = true;
SQLInSubQueryExpr notInSubQueryExpr = new SQLInSubQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(notInSubQueryExpr);
notInSubQueryExpr.setNot(true);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr xp = (SQLBinaryOpExpr) x.getParent();
if (xp.getLeft().equals(x)) {
notInSubQueryExpr.setExpr(xp.getRight());
} else if (xp.getRight().equals(x)) {
notInSubQueryExpr.setExpr(xp.getLeft());
}
if (xp.getParent() instanceof MySqlSelectQueryBlock) {
((MySqlSelectQueryBlock) xp.getParent()).setWhere(notInSubQueryExpr);
} else if (xp.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr pp = ((SQLBinaryOpExpr) xp.getParent());
if (pp.getLeft().equals(xp)) {
pp.setLeft(notInSubQueryExpr);
} else if (pp.getRight().equals(xp)) {
pp.setRight(notInSubQueryExpr);
}
}
}
addSubQuerys(x.getSubQuery());
return super.visit(notInSubQueryExpr);
case Equality:
this.hasChange = true;
SQLInSubQueryExpr inSubQueryExpr = new SQLInSubQueryExpr(x.getSubQuery());
x.getSubQuery().setParent(inSubQueryExpr);
inSubQueryExpr.setNot(false);
// 生成新的SQLQueryExpr 替换当前 SQLAllExpr 节点
if (x.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr xp = (SQLBinaryOpExpr) x.getParent();
if (xp.getLeft().equals(x)) {
inSubQueryExpr.setExpr(xp.getRight());
} else if (xp.getRight().equals(x)) {
inSubQueryExpr.setExpr(xp.getLeft());
}
if (xp.getParent() instanceof MySqlSelectQueryBlock) {
((MySqlSelectQueryBlock) xp.getParent()).setWhere(inSubQueryExpr);
} else if (xp.getParent() instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr pp = ((SQLBinaryOpExpr) xp.getParent());
if (pp.getLeft().equals(xp)) {
pp.setLeft(inSubQueryExpr);
} else if (pp.getRight().equals(xp)) {
pp.setRight(inSubQueryExpr);
}
}
}
addSubQuerys(x.getSubQuery());
return super.visit(inSubQueryExpr);
default:
break;
}
}
addSubQuerys(x.getSubQuery());
return super.visit(x);
}
Aggregations