mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -36,6 +36,9 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName {
|
||||
}
|
||||
|
||||
public SQLPropertyExpr(SQLExpr owner, String name){
|
||||
if (name == null) {
|
||||
throw new IllegalArgumentException("name is null.");
|
||||
}
|
||||
setOwner(owner);
|
||||
this.name = name;
|
||||
}
|
||||
@@ -59,8 +62,8 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName {
|
||||
}
|
||||
|
||||
public String getOwnernName() {
|
||||
if (owner instanceof SQLIdentifierExpr) {
|
||||
return ((SQLIdentifierExpr) owner).getName();
|
||||
if (owner instanceof SQLName) {
|
||||
return ((SQLName) owner).toString();
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
@@ -197,22 +197,9 @@ public class SQLExprTableSource extends SQLTableSourceImpl {
|
||||
}
|
||||
|
||||
public boolean containsAlias(String alias) {
|
||||
if (SQLUtils.nameEquals(this.alias, alias)) {
|
||||
return true;
|
||||
}
|
||||
long hashCode64 = FnvHash.hashCode64(alias);
|
||||
|
||||
String name = null;
|
||||
if (expr instanceof SQLIdentifierExpr) {
|
||||
name = ((SQLIdentifierExpr) expr).getName();
|
||||
} else if (expr instanceof SQLPropertyExpr) {
|
||||
name = ((SQLPropertyExpr) expr).getName();
|
||||
}
|
||||
|
||||
if (name != null && SQLUtils.nameEquals(name, alias)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
return containsAlias(hashCode64);
|
||||
}
|
||||
|
||||
public boolean containsAlias(long aliasHash) {
|
||||
@@ -220,9 +207,16 @@ public class SQLExprTableSource extends SQLTableSourceImpl {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (expr instanceof SQLPropertyExpr) {
|
||||
long exprNameHash = ((SQLPropertyExpr) expr).hashCode64();
|
||||
if (exprNameHash == aliasHash) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (expr instanceof SQLName) {
|
||||
long exprNameHash = ((SQLName) expr).nameHashCode64();
|
||||
return exprNameHash == aliasHashCod64;
|
||||
return exprNameHash == aliasHash;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -459,11 +459,13 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace
|
||||
return false;
|
||||
}
|
||||
|
||||
if (left.containsAlias(alias_a) && right.containsAlias(alias_b)) {
|
||||
if (left.containsAlias(alias_a)
|
||||
&& right.containsAlias(alias_b)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return right.containsAlias(alias_a) && left.containsAlias(alias_b);
|
||||
return right.containsAlias(alias_a)
|
||||
&& left.containsAlias(alias_b);
|
||||
}
|
||||
|
||||
public boolean conditionContainsTable(String alias) {
|
||||
@@ -499,4 +501,16 @@ public class SQLJoinTableSource extends SQLTableSourceImpl implements SQLReplace
|
||||
|
||||
return right.findTableSource(alias_hash);
|
||||
}
|
||||
|
||||
public SQLTableSource other(SQLTableSource x) {
|
||||
if (left == x) {
|
||||
return right;
|
||||
}
|
||||
|
||||
if (right == x) {
|
||||
return left;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1649,6 +1649,10 @@ class SchemaResolveVisitorFactory {
|
||||
|
||||
if (ctxTable instanceof SQLJoinTableSource) {
|
||||
String alias = tableSource.computeAlias();
|
||||
if (alias == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
SQLPropertyExpr propertyExpr = new SQLPropertyExpr(new SQLIdentifierExpr(alias), ident, hash);
|
||||
propertyExpr.setResolvedColumn(x.getResolvedColumn());
|
||||
propertyExpr.setResolvedTableSource(x.getResolvedTableSource());
|
||||
|
||||
Reference in New Issue
Block a user