未验证 提交 d429dec1 编写于 作者: L Liang Zhang 提交者: GitHub

Merge pull request #2886 from tristaZero/dev

Fix the wrong parsing for columnSegement
......@@ -43,7 +43,7 @@ public final class ColumnExtractor implements OptionalSQLSegmentExtractor {
private ColumnSegment getColumnSegment(final ParserRuleContext columnNode) {
ParserRuleContext nameNode = ExtractorUtils.getFirstChildNode(columnNode, RuleName.NAME);
ColumnSegment result = new ColumnSegment(columnNode.getStart().getStartIndex(), columnNode.getStart().getStopIndex(), nameNode.getText());
ColumnSegment result = new ColumnSegment(columnNode.getStart().getStartIndex(), columnNode.getStop().getStopIndex(), nameNode.getText());
Optional<ParserRuleContext> ownerNode = ExtractorUtils.findFirstChildNodeNoneRecursive(columnNode, RuleName.OWNER);
if (ownerNode.isPresent()) {
result.setOwner(new TableSegment(ownerNode.get().getStart().getStartIndex(), ownerNode.get().getStop().getStopIndex(), ownerNode.get().getText()));
......
......@@ -22,6 +22,7 @@ import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.ColumnSelectItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemSegment;
import org.apache.shardingsphere.core.parse.sql.segment.dml.item.SelectItemsSegment;
import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.rewrite.builder.ParameterBuilder;
import org.apache.shardingsphere.core.rewrite.token.pojo.SelectEncryptItemToken;
......@@ -79,12 +80,21 @@ public final class SelectEncryptItemTokenGenerator implements CollectionSQLToken
return each instanceof ColumnSelectItemSegment && logicColumns.contains(((ColumnSelectItemSegment) each).getName());
}
private SelectEncryptItemToken createSelectCipherItemToken(final SelectItemSegment each, final String tableName, final EncryptRule encryptRule, final boolean isQueryWithCipherColumn) {
String columnName = ((ColumnSelectItemSegment) each).getName();
private SelectEncryptItemToken createSelectCipherItemToken(final SelectItemSegment selectItemSegment,
final String tableName, final EncryptRule encryptRule, final boolean isQueryWithCipherColumn) {
String columnName = ((ColumnSelectItemSegment) selectItemSegment).getName();
Optional<String> plainColumn = encryptRule.getPlainColumn(tableName, columnName);
if (!isQueryWithCipherColumn && plainColumn.isPresent()) {
return new SelectEncryptItemToken(each.getStartIndex(), each.getStopIndex(), plainColumn.get());
return createSelectEncryptItemToken(selectItemSegment, plainColumn.get());
}
return new SelectEncryptItemToken(each.getStartIndex(), each.getStopIndex(), encryptRule.getCipherColumn(tableName, columnName));
return createSelectEncryptItemToken(selectItemSegment, encryptRule.getCipherColumn(tableName, columnName));
}
private SelectEncryptItemToken createSelectEncryptItemToken(final SelectItemSegment selectItemSegment, final String columnName) {
Optional<TableSegment> owner = ((ColumnSelectItemSegment) selectItemSegment).getOwner();
if (owner.isPresent()) {
return new SelectEncryptItemToken(selectItemSegment.getStartIndex(), selectItemSegment.getStopIndex(), columnName, owner.get().getTableName());
}
return new SelectEncryptItemToken(selectItemSegment.getStartIndex(), selectItemSegment.getStopIndex(), columnName);
}
}
......@@ -29,16 +29,23 @@ public final class SelectEncryptItemToken extends SQLToken implements Substituta
private final int stopIndex;
private final String selectItemName;
private final String columnName;
public SelectEncryptItemToken(final int startIndex, final int stopIndex, final String selectItemName) {
private final String owner;
public SelectEncryptItemToken(final int startIndex, final int stopIndex, final String columnName, final String owner) {
super(startIndex);
this.stopIndex = stopIndex;
this.selectItemName = selectItemName;
this.columnName = columnName;
this.owner = owner;
}
public SelectEncryptItemToken(final int startIndex, final int stopIndex, final String columnName) {
this(startIndex, stopIndex, columnName, null);
}
@Override
public String toString() {
return selectItemName;
return null == owner ? columnName : String.format("%s.%s", owner, columnName);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册