in core/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java [1401:1615]
static void resolve(SchemaResolveVisitor visitor, SQLSelectQueryBlock x) {
SchemaResolveVisitor.Context ctx = visitor.createContext(x);
if (ctx != null && ctx.level >= 32) {
return;
}
SQLTableSource from = x.getFrom();
if (from != null) {
ctx.setTableSource(from);
Class fromClass = from.getClass();
if (fromClass == SQLExprTableSource.class) {
visitor.visit((SQLExprTableSource) from);
} else {
from.accept(visitor);
}
} else if (x.getParent() != null && x.getParent().getParent() instanceof HiveInsert
&& x.getParent().getParent().getParent() instanceof HiveMultiInsertStatement) {
HiveMultiInsertStatement insert = (HiveMultiInsertStatement) x.getParent().getParent().getParent();
if (insert.getFrom() instanceof SQLExprTableSource) {
from = insert.getFrom();
ctx.setTableSource(from);
}
}
List<SQLSelectItem> selectList = x.getSelectList();
List<SQLSelectItem> columns = new ArrayList<SQLSelectItem>();
for (int i = selectList.size() - 1; i >= 0; i--) {
SQLSelectItem selectItem = selectList.get(i);
SQLExpr expr = selectItem.getExpr();
if (expr instanceof SQLAllColumnExpr) {
SQLAllColumnExpr allColumnExpr = (SQLAllColumnExpr) expr;
SQLExpr owner = allColumnExpr.getOwner();
SQLTableSource resolvedTableSource = from;
if (owner instanceof SQLIdentifierExpr) {
String ownerName = ((SQLIdentifierExpr) owner).getName();
resolvedTableSource = x.findTableSource(ownerName);
}
allColumnExpr.setResolvedTableSource(resolvedTableSource);
visitor.visit(allColumnExpr);
if (visitor.isEnabled(SchemaResolveVisitor.Option.ResolveAllColumn)) {
extractColumns(visitor, resolvedTableSource, null, columns);
}
} else if (expr instanceof SQLPropertyExpr) {
SQLPropertyExpr propertyExpr = (SQLPropertyExpr) expr;
visitor.visit(propertyExpr);
String ownerName = propertyExpr.getOwnernName();
if (propertyExpr.getName().equals("*")) {
if (visitor.isEnabled(SchemaResolveVisitor.Option.ResolveAllColumn)) {
SQLTableSource tableSource = x.findTableSource(ownerName);
extractColumns(visitor, tableSource, ownerName, columns);
}
}
SQLColumnDefinition column = propertyExpr.getResolvedColumn();
if (column != null) {
continue;
}
SQLTableSource tableSource = x.findTableSource(propertyExpr.getOwnernName());
if (tableSource != null) {
column = tableSource.findColumn(propertyExpr.nameHashCode64());
if (column != null) {
propertyExpr.setResolvedColumn(column);
}
}
} else if (expr instanceof SQLAllColumnExpr) {
SQLAllColumnExpr allColumnExpr = (SQLAllColumnExpr) expr;
SQLExpr owner = allColumnExpr.getOwner();
if (owner instanceof SQLIdentifierExpr) {
SQLIdentifierExpr ownerIdent = (SQLIdentifierExpr) owner;
String ownerName = ownerIdent.getName();
if (visitor.isEnabled(SchemaResolveVisitor.Option.ResolveAllColumn)) {
SQLTableSource tableSource = x.findTableSource(ownerName);
extractColumns(visitor, tableSource, ownerName, columns);
}
}
} else if (expr instanceof SQLIdentifierExpr) {
SQLIdentifierExpr identExpr = (SQLIdentifierExpr) expr;
visitor.visit(identExpr);
long name_hash = identExpr.nameHashCode64();
SQLColumnDefinition column = identExpr.getResolvedColumn();
if (column != null) {
continue;
}
if (from == null) {
continue;
}
column = from.findColumn(name_hash);
if (column != null) {
identExpr.setResolvedColumn(column);
}
} else {
expr.accept(visitor);
}
if (columns.size() > 0) {
for (SQLSelectItem column : columns) {
column.setParent(x);
column.getExpr().accept(visitor);
}
selectList.remove(i);
selectList.addAll(i, columns);
columns.clear();
}
}
SQLExprTableSource into = x.getInto();
if (into != null) {
visitor.visit(into);
}
SQLExpr where = x.getWhere();
if (where != null) {
if (where instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) where;
resolveExpr(visitor, binaryOpExpr.getLeft());
resolveExpr(visitor, binaryOpExpr.getRight());
} else if (where instanceof SQLBinaryOpExprGroup) {
SQLBinaryOpExprGroup binaryOpExprGroup = (SQLBinaryOpExprGroup) where;
for (SQLExpr item : binaryOpExprGroup.getItems()) {
if (item instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) item;
resolveExpr(visitor, binaryOpExpr.getLeft());
resolveExpr(visitor, binaryOpExpr.getRight());
} else {
item.accept(visitor);
}
}
} else {
where.accept(visitor);
}
}
SQLExpr startWith = x.getStartWith();
if (startWith != null) {
startWith.accept(visitor);
}
SQLExpr connectBy = x.getConnectBy();
if (connectBy != null) {
connectBy.accept(visitor);
}
SQLSelectGroupByClause groupBy = x.getGroupBy();
if (groupBy != null) {
groupBy.accept(visitor);
}
List<SQLWindow> windows = x.getWindows();
if (windows != null) {
for (SQLWindow window : windows) {
window.accept(visitor);
}
}
SQLOrderBy orderBy = x.getOrderBy();
if (orderBy != null) {
for (SQLSelectOrderByItem orderByItem : orderBy.getItems()) {
SQLExpr orderByItemExpr = orderByItem.getExpr();
if (orderByItemExpr instanceof SQLIdentifierExpr) {
SQLIdentifierExpr orderByItemIdentExpr = (SQLIdentifierExpr) orderByItemExpr;
long hash = orderByItemIdentExpr.nameHashCode64();
SQLSelectItem selectItem = x.findSelectItem(hash);
if (selectItem != null) {
orderByItem.setResolvedSelectItem(selectItem);
SQLExpr selectItemExpr = selectItem.getExpr();
if (selectItemExpr instanceof SQLIdentifierExpr) {
orderByItemIdentExpr.setResolvedTableSource(((SQLIdentifierExpr) selectItemExpr).getResolvedTableSource());
orderByItemIdentExpr.setResolvedColumn(((SQLIdentifierExpr) selectItemExpr).getResolvedColumn());
} else if (selectItemExpr instanceof SQLPropertyExpr) {
orderByItemIdentExpr.setResolvedTableSource(((SQLPropertyExpr) selectItemExpr).getResolvedTableSource());
orderByItemIdentExpr.setResolvedColumn(((SQLPropertyExpr) selectItemExpr).getResolvedColumn());
}
continue;
}
}
orderByItemExpr.accept(visitor);
}
}
int forUpdateOfSize = x.getForUpdateOfSize();
if (forUpdateOfSize > 0) {
for (SQLExpr sqlExpr : x.getForUpdateOf()) {
sqlExpr.accept(visitor);
}
}
List<SQLSelectOrderByItem> distributeBy = x.getDistributeBy();
if (distributeBy != null) {
for (SQLSelectOrderByItem item : distributeBy) {
item.accept(visitor);
}
}
List<SQLSelectOrderByItem> sortBy = x.getSortBy();
if (sortBy != null) {
for (SQLSelectOrderByItem item : sortBy) {
item.accept(visitor);
}
}
visitor.popContext();
}