diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index 0b13a1132d..a8d912ca67 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -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; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index 8fe274feff..1cb6810c89 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java @@ -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; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index 81c7f0c025..be4eb58a0d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java index edef5ce137..913d751d9d 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -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());