提交 fbc9a235 编写于 作者: T terrymanu

for #1753, parse subquery for select from table

上级 a662f1d9
......@@ -40,7 +40,7 @@ public final class SelectItemsExtractor implements OptionalSQLSegmentExtractor {
@Override
public Optional<SelectItemsSegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
ParserRuleContext selectItemsNode = ExtractorUtils.getFirstChildNode(findMainQueryNode(ancestorNode, false), RuleName.SELECT_ITEMS);
ParserRuleContext selectItemsNode = ExtractorUtils.getFirstChildNode(findMainQueryNode(ancestorNode), RuleName.SELECT_ITEMS);
SelectItemsSegment result = new SelectItemsSegment(selectItemsNode.getStart().getStartIndex(), selectItemsNode.getStop().getStopIndex(), extractDistinct(ancestorNode));
Optional<ParserRuleContext> unqualifiedShorthandNode = ExtractorUtils.findFirstChildNode(selectItemsNode, RuleName.UNQUALIFIED_SHORTHAND);
if (unqualifiedShorthandNode.isPresent()) {
......@@ -73,18 +73,15 @@ public final class SelectItemsExtractor implements OptionalSQLSegmentExtractor {
&& (duplicateSpecificationNode.get().getText().equalsIgnoreCase("DISTINCT") || duplicateSpecificationNode.get().getText().equalsIgnoreCase("DISTINCTROW"));
}
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode, final boolean isFromRecursive) {
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode) {
Optional<ParserRuleContext> tableReferencesNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.TABLE_REFERENCES);
if (!tableReferencesNode.isPresent()) {
return ancestorNode;
}
ParserRuleContext result = tableReferencesNode.get();
Optional<ParserRuleContext> subqueryNode = ExtractorUtils.findSingleNodeFromFirstDescendant(tableReferencesNode.get(), RuleName.SUBQUERY);
boolean isFromRecursiveInMethod = false;
if (subqueryNode.isPresent()) {
isFromRecursiveInMethod = true;
result = findMainQueryNode(subqueryNode.get(), true);
return findMainQueryNode(subqueryNode.get());
}
return isFromRecursive || isFromRecursiveInMethod ? result : ancestorNode;
return ancestorNode;
}
}
......@@ -23,7 +23,6 @@ import org.apache.shardingsphere.core.parse.antlr.extractor.api.OptionalSQLSegme
import org.apache.shardingsphere.core.parse.antlr.extractor.impl.dml.PredicateExtractor;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.ExtractorUtils;
import org.apache.shardingsphere.core.parse.antlr.extractor.util.RuleName;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.OrPredicateSegment;
import org.apache.shardingsphere.core.parse.antlr.sql.segment.dml.predicate.SubqueryPredicateSegment;
import java.util.Collection;
......@@ -43,10 +42,7 @@ public final class SubqueryPredicateExtractor implements OptionalSQLSegmentExtra
Collection<ParserRuleContext> subqueryNodes = ExtractorUtils.getAllDescendantNodes(ancestorNode, RuleName.SUBQUERY);
SubqueryPredicateSegment result = new SubqueryPredicateSegment();
for (ParserRuleContext each : subqueryNodes) {
Optional<OrPredicateSegment> orPredicateSegment = predicateExtractor.extract(each, parameterMarkerIndexes);
if (orPredicateSegment.isPresent()) {
result.getOrPredicates().add(orPredicateSegment.get());
}
predicateExtractor.extract(each, parameterMarkerIndexes);
}
return Optional.of(result);
}
......
......@@ -42,23 +42,20 @@ public abstract class GroupByExtractor implements OptionalSQLSegmentExtractor {
@Override
public final Optional<GroupBySegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
Optional<ParserRuleContext> groupByNode = ExtractorUtils.findFirstChildNode(findMainQueryNode(ancestorNode, false), RuleName.GROUP_BY_CLAUSE);
Optional<ParserRuleContext> groupByNode = ExtractorUtils.findFirstChildNode(findMainQueryNode(ancestorNode), RuleName.GROUP_BY_CLAUSE);
return groupByNode.isPresent() ? Optional.of(new GroupBySegment(groupByNode.get().getStop().getStopIndex(), orderByItemExtractor.extract(groupByNode.get(), parameterMarkerIndexes)))
: Optional.<GroupBySegment>absent();
}
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode, final boolean isFromRecursive) {
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode) {
Optional<ParserRuleContext> tableReferencesNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.TABLE_REFERENCES);
if (!tableReferencesNode.isPresent()) {
return ancestorNode;
}
ParserRuleContext result = tableReferencesNode.get();
Optional<ParserRuleContext> subqueryNode = ExtractorUtils.findSingleNodeFromFirstDescendant(tableReferencesNode.get(), RuleName.SUBQUERY);
boolean isFromRecursiveInMethod = false;
if (subqueryNode.isPresent()) {
isFromRecursiveInMethod = true;
result = findMainQueryNode(subqueryNode.get(), true);
return findMainQueryNode(subqueryNode.get());
}
return isFromRecursive || isFromRecursiveInMethod ? result : ancestorNode;
return ancestorNode;
}
}
......@@ -40,22 +40,19 @@ public abstract class OrderByExtractor implements OptionalSQLSegmentExtractor {
@Override
public final Optional<OrderBySegment> extract(final ParserRuleContext ancestorNode, final Map<ParserRuleContext, Integer> parameterMarkerIndexes) {
Optional<ParserRuleContext> orderByNode = ExtractorUtils.findFirstChildNode(findMainQueryNode(ancestorNode, false), RuleName.ORDER_BY_CLAUSE);
Optional<ParserRuleContext> orderByNode = ExtractorUtils.findFirstChildNode(findMainQueryNode(ancestorNode), RuleName.ORDER_BY_CLAUSE);
return orderByNode.isPresent() ? Optional.of(new OrderBySegment(orderByItemExtractor.extract(orderByNode.get(), parameterMarkerIndexes))) : Optional.<OrderBySegment>absent();
}
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode, final boolean isFromRecursive) {
private ParserRuleContext findMainQueryNode(final ParserRuleContext ancestorNode) {
Optional<ParserRuleContext> tableReferencesNode = ExtractorUtils.findFirstChildNode(ancestorNode, RuleName.TABLE_REFERENCES);
if (!tableReferencesNode.isPresent()) {
return ancestorNode;
}
ParserRuleContext result = tableReferencesNode.get();
Optional<ParserRuleContext> subqueryNode = ExtractorUtils.findSingleNodeFromFirstDescendant(tableReferencesNode.get(), RuleName.SUBQUERY);
boolean isFromRecursiveInMethod = false;
if (subqueryNode.isPresent()) {
isFromRecursiveInMethod = true;
result = findMainQueryNode(subqueryNode.get(), true);
return findMainQueryNode(subqueryNode.get());
}
return isFromRecursive || isFromRecursiveInMethod ? result : ancestorNode;
return ancestorNode;
}
}
......@@ -157,7 +157,7 @@ tableReference
;
tableFactor
: tableName partitionNames_? (AS? alias)? indexHintList_? | subquery AS? alias columnNames? | LP_ tableReferences RP_
: tableName partitionNames_? (AS? alias)? indexHintList_? | subquery columnNames? | LP_ tableReferences RP_
;
partitionNames_
......@@ -215,5 +215,5 @@ windowItem_
;
subquery
: LP_ unionClause_ RP_
: LP_ unionClause_ RP_ AS? alias?
;
......@@ -125,7 +125,7 @@ tableReference
;
tableFactor
: tableName (AS? alias)? | subquery AS? alias? columnNames? | LP_ tableReferences RP_
: tableName (AS? alias)? | subquery columnNames? | LP_ tableReferences RP_
;
joinedTable
......@@ -150,5 +150,5 @@ havingClause
;
subquery
: LP_ unionClause_ RP_
: LP_ unionClause_ RP_ AS? alias?
;
......@@ -125,7 +125,7 @@ tableReference
;
tableFactor
: tableName (AS? alias)? | subquery AS? alias columnNames? | LP_ tableReferences RP_
: tableName (AS? alias)? | subquery columnNames? | LP_ tableReferences RP_
;
joinedTable
......@@ -171,5 +171,5 @@ limitOffset
;
subquery
: LP_ unionClause_ RP_
: LP_ unionClause_ RP_ AS? alias?
;
......@@ -17,7 +17,7 @@
grammar PostgreSQLStatement;
import Symbol, Comments, DDLStatement, DMLStatement, TCLStatement, DCLStatement, DALStatement;
import Symbol, Comments, DMLStatement, DDLStatement, TCLStatement, DCLStatement, DALStatement;
execute
: (select
......
......@@ -17,7 +17,6 @@
-->
<parser-result-sets>
<!--
<parser-result sql-case-id="select_sub_query_with_single_table" parameters="1, 2">
<tables>
<table name="t_order" alias="o" />
......@@ -34,7 +33,7 @@
</and-condition>
</or-condition>
</parser-result>
-->
<!-- TODO cannot pass,add later
<parser-result sql-case-id="select_sub_query_with_multiple_tables" parameters="1, 2">
<tables>
......
......@@ -17,9 +17,7 @@
-->
<sql-cases>
<!--
<sql-case id="select_sub_query_with_single_table" value="SELECT t.* FROM (SELECT o.* FROM t_order o WHERE o.order_id IN (?, ?)) t ORDER BY t.order_id" db-types="MySQL,PostgreSQL,SQLServer,Oracle" />
-->
<!-- TODO cannot pass,add later
<sql-case id="select_sub_query_with_multiple_tables" value="SELECT t.* FROM (SELECT i.* FROM t_order o, t_order_item i WHERE o.order_id = i.order_id and o.order_id IN (?, ?)) t ORDER BY t.item_id" db-types="SQLServer,Oracle" />
-->
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册