improved sql parser.

This commit is contained in:
wenshao
2017-09-05 11:40:36 +08:00
parent 1ae0aea5c8
commit 6545e23629
4 changed files with 35 additions and 20 deletions
@@ -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());