You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/05/14 11:13:33 UTC
[shardingsphere] branch master updated: Convert unreadable literals into readable (#17640)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 80b127cdc65 Convert unreadable literals into readable (#17640)
80b127cdc65 is described below
commit 80b127cdc65b8d9394a5bb1e322bdf1667fa1c27
Author: cheese8 <yi...@163.com>
AuthorDate: Sat May 14 19:13:28 2022 +0800
Convert unreadable literals into readable (#17640)
* support is null or is not null on right
* double check set null testcase
* fix testcase failure
* fix checkstyle
* fix testcase failure
* align to review
* implement it with parse way
* optimized
* Update ExpressionExtractUtil.java
* revert to using LiteralExpressionSegment
* fix testcases
* convert unreadable literal into readable
* revert EncryptConditionEngine
* revert ExpressionExtractUtil
* revert update.xml
* Update ExpressionExtractUtil.java
* Update update.xml
* for oracle sql92, mssql
* Update select-with.xml
* remove trim logic in parsing step
* parsing way to avoid spaces
* optimized remove extra spaces
* align to checkstyle
* not fixed "NOT"
* optimized
* Update SQLServerStatementSQLVisitor.java
---
.../statement/impl/MySQLStatementSQLVisitor.java | 23 +++++++++++++++++++---
.../statement/impl/OracleStatementSQLVisitor.java | 23 +++++++++++++++++++---
.../statement/impl/SQL92StatementSQLVisitor.java | 23 +++++++++++++++++++---
.../impl/SQLServerStatementSQLVisitor.java | 23 +++++++++++++++++++---
.../main/resources/case/dml/select-expression.xml | 8 ++++----
.../src/main/resources/case/dml/select-with.xml | 4 ++--
.../src/main/resources/case/dml/select.xml | 4 ++--
7 files changed, 88 insertions(+), 20 deletions(-)
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
index 32a75d656c0..765f0d3a9c8 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-mysql/src/main/java/org/apache/shardingsphere/sql/parser/mysql/visitor/statement/impl/MySQLStatementSQLVisitor.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
@@ -416,11 +417,27 @@ public abstract class MySQLStatementSQLVisitor extends MySQLStatementBaseVisitor
@Override
public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
if (null != ctx.IS()) {
+ String rightText = "";
+ if (null != ctx.NOT()) {
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(ctx.NOT().getSymbol().getStartIndex(),
+ ctx.NOT().getSymbol().getStopIndex()))).concat(" ");
+ }
+ Token operatorToken = null;
+ if (null != ctx.NULL()) {
+ operatorToken = ctx.NULL().getSymbol();
+ }
+ if (null != ctx.TRUE()) {
+ operatorToken = ctx.TRUE().getSymbol();
+ }
+ if (null != ctx.FALSE()) {
+ operatorToken = ctx.FALSE().getSymbol();
+ }
+ int startIndex = null == operatorToken ? ctx.IS().getSymbol().getStopIndex() + 1 : operatorToken.getStartIndex();
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(startIndex, ctx.stop.getStopIndex())));
+ ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), rightText);
+ String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
- ctx.stop.getStopIndex()));
String operator = "IS";
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
}
if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
index 56d06adcf6a..a3915007a9a 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-oracle/src/main/java/org/apache/shardingsphere/sql/parser/oracle/visitor/statement/impl/OracleStatementSQLVisitor.java
@@ -22,6 +22,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
@@ -324,11 +325,27 @@ public abstract class OracleStatementSQLVisitor extends OracleStatementBaseVisit
@Override
public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
if (null != ctx.IS()) {
+ String rightText = "";
+ if (null != ctx.NOT()) {
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(ctx.NOT().getSymbol().getStartIndex(),
+ ctx.NOT().getSymbol().getStopIndex()))).concat(" ");
+ }
+ Token operatorToken = null;
+ if (null != ctx.NULL()) {
+ operatorToken = ctx.NULL().getSymbol();
+ }
+ if (null != ctx.TRUE()) {
+ operatorToken = ctx.TRUE().getSymbol();
+ }
+ if (null != ctx.FALSE()) {
+ operatorToken = ctx.FALSE().getSymbol();
+ }
+ int startIndex = null == operatorToken ? ctx.IS().getSymbol().getStopIndex() + 1 : operatorToken.getStartIndex();
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(startIndex, ctx.stop.getStopIndex())));
+ ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), rightText);
+ String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
- ctx.stop.getStopIndex()));
String operator = "IS";
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
}
if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
index b25e848b3b4..28e9cf98704 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sql92/src/main/java/org/apache/shardingsphere/sql/parser/sql92/visitor/statement/impl/SQL92StatementSQLVisitor.java
@@ -22,6 +22,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
@@ -261,11 +262,27 @@ public abstract class SQL92StatementSQLVisitor extends SQL92StatementBaseVisitor
@Override
public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
if (null != ctx.IS()) {
+ String rightText = "";
+ if (null != ctx.NOT()) {
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(ctx.NOT().getSymbol().getStartIndex(),
+ ctx.NOT().getSymbol().getStopIndex()))).concat(" ");
+ }
+ Token operatorToken = null;
+ if (null != ctx.NULL()) {
+ operatorToken = ctx.NULL().getSymbol();
+ }
+ if (null != ctx.TRUE()) {
+ operatorToken = ctx.TRUE().getSymbol();
+ }
+ if (null != ctx.FALSE()) {
+ operatorToken = ctx.FALSE().getSymbol();
+ }
+ int startIndex = null == operatorToken ? ctx.IS().getSymbol().getStopIndex() + 1 : operatorToken.getStartIndex();
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(startIndex, ctx.stop.getStopIndex())));
+ ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), rightText);
+ String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
- ctx.stop.getStopIndex()));
String operator = "IS";
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
}
if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
diff --git a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
index 0981dcec708..18e2fd76b5b 100644
--- a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
+++ b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerStatementSQLVisitor.java
@@ -21,6 +21,7 @@ import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.misc.Interval;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.apache.shardingsphere.sql.parser.api.visitor.ASTNode;
@@ -374,11 +375,27 @@ public abstract class SQLServerStatementSQLVisitor extends SQLServerStatementBas
@Override
public final ASTNode visitBooleanPrimary(final BooleanPrimaryContext ctx) {
if (null != ctx.IS()) {
+ String rightText = "";
+ if (null != ctx.NOT()) {
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(ctx.NOT().getSymbol().getStartIndex(),
+ ctx.NOT().getSymbol().getStopIndex()))).concat(" ");
+ }
+ Token operatorToken = null;
+ if (null != ctx.NULL()) {
+ operatorToken = ctx.NULL().getSymbol();
+ }
+ if (null != ctx.TRUE()) {
+ operatorToken = ctx.TRUE().getSymbol();
+ }
+ if (null != ctx.FALSE()) {
+ operatorToken = ctx.FALSE().getSymbol();
+ }
+ int startIndex = null == operatorToken ? ctx.IS().getSymbol().getStopIndex() + 1 : operatorToken.getStartIndex();
+ rightText = rightText.concat(ctx.start.getInputStream().getText(new Interval(startIndex, ctx.stop.getStopIndex())));
+ ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), rightText);
+ String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
ExpressionSegment left = (ExpressionSegment) visit(ctx.booleanPrimary());
- ExpressionSegment right = new LiteralExpressionSegment(ctx.IS().getSymbol().getStopIndex() + 1, ctx.stop.getStopIndex(), new Interval(ctx.IS().getSymbol().getStopIndex() + 1,
- ctx.stop.getStopIndex()));
String operator = "IS";
- String text = ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex()));
return new BinaryOperationExpression(ctx.start.getStartIndex(), ctx.stop.getStopIndex(), left, right, operator, text);
}
if (null != ctx.comparisonOperator() || null != ctx.SAFE_EQ_()) {
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
index 2645e04d5ff..27bac97a726 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-expression.xml
@@ -551,7 +551,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="51..56" start-index="51" stop-index="56"/>
+ <literal-expression value="FALSE" start-index="51" stop-index="56"/>
</right>
</binary-operation-expression>
</expr>
@@ -584,7 +584,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="51..60" start-index="51" stop-index="60"/>
+ <literal-expression value="NOT FALSE" start-index="51" stop-index="60"/>
</right>
</binary-operation-expression>
</expr>
@@ -608,7 +608,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="45..49" start-index="45" stop-index="49"/>
+ <literal-expression value="NULL" start-index="45" stop-index="49"/>
</right>
</binary-operation-expression>
</expr>
@@ -632,7 +632,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="45..53" start-index="45" stop-index="53"/>
+ <literal-expression value="NOT NULL" start-index="45" stop-index="53"/>
</right>
</binary-operation-expression>
</expr>
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-with.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-with.xml
index e22feb5a936..d4fa6531cc7 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-with.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select-with.xml
@@ -172,7 +172,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="177..181" start-index="177" stop-index="181" />
+ <literal-expression value="NULL" start-index="177" stop-index="181" />
</right>
</binary-operation-expression>
</expr>
@@ -223,7 +223,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="186..190" start-index="186" stop-index="190" />
+ <literal-expression value="NULL" start-index="186" stop-index="190" />
</right>
</binary-operation-expression>
</expr>
diff --git a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
index 5bc815ade87..7cf049feb43 100644
--- a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
+++ b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dml/select.xml
@@ -263,7 +263,7 @@
</left>
<operator>IS</operator>
<right>
- <literal-expression value="43..51" start-index="43" stop-index="51" />
+ <literal-expression value="NOT NULL" start-index="43" stop-index="51" />
</right>
</binary-operation-expression>
<common-expression text="item_id IS NOT NULL" start-index="33" stop-index="51" />
@@ -315,7 +315,7 @@
<operator>IS</operator>
<right>
<!-- TODO: literal value should be 'NOT NULL' -->
- <literal-expression value="43..51" start-index="43" stop-index="51" />
+ <literal-expression value="NOT NULL" start-index="43" stop-index="51" />
</right>
</binary-operation-expression>
<common-expression text="item_id IS NOT NULL" start-index="33" stop-index="51" />