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 3c3096ec209 Refactor IdentifierValue (#35695) 3c3096ec209 is described below commit 3c3096ec209eab70e3c3472a8416e51e41bdc22b Author: Cong Hu <iamhuc...@gmail.com> AuthorDate: Mon Jun 16 09:28:27 2025 +0800 Refactor IdentifierValue (#35695) --- .../core/ShardingDistSQLStatementVisitor.java | 2 +- .../sql/parser/statement/core/util/SQLUtils.java | 37 +++++++++++++++------- .../core/value/identifier/IdentifierValue.java | 11 ++++--- .../core/value/identifier/IdentifierValueTest.java | 12 ------- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java b/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java index ac4f808d994..89d077f8565 100644 --- a/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java +++ b/features/sharding/distsql/parser/src/main/java/org/apache/shardingsphere/sharding/distsql/parser/core/ShardingDistSQLStatementVisitor.java @@ -302,7 +302,7 @@ public final class ShardingDistSQLStatementVisitor extends ShardingDistSQLStatem if (null == context) { return null; } - String value = new IdentifierValue(context.getText(), "[]'").getValue(); + String value = new IdentifierValue(context.getText()).getValue(); return value.startsWith("'") ? value.substring(1, value.length() - 1) : value.trim(); } diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java index 58bb8195795..e64744749da 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/util/SQLUtils.java @@ -124,21 +124,34 @@ public final class SQLUtils { return null; } if (value.startsWith(BACKTICK) && value.endsWith(BACKTICK)) { - int startIndex = 1; - int stopIndex = value.length() - 1; - StringBuilder exactlyTableName = new StringBuilder(); - while (startIndex < stopIndex) { - if (value.charAt(startIndex) == '`' && (startIndex + 1 >= stopIndex || value.charAt(startIndex + 1) != '`')) { - return value; - } else if (value.charAt(startIndex) == '`' && value.charAt(startIndex + 1) == '`') { - startIndex++; - } - exactlyTableName.append(value.charAt(startIndex)); + return getRealContentInBackticks(value); + } + return value; + } + + /** + * Get exactly content in backticks. + * + * @param value SQL expression + * @return exactly content in backticks + */ + public static String getRealContentInBackticks(final String value) { + if (null == value) { + return null; + } + int startIndex = 1; + int stopIndex = value.length() - 1; + StringBuilder exactlyTableName = new StringBuilder(); + while (startIndex < stopIndex) { + if (value.charAt(startIndex) == '`' && (startIndex + 1 >= stopIndex || value.charAt(startIndex + 1) != '`')) { + return value; + } else if (value.charAt(startIndex) == '`' && value.charAt(startIndex + 1) == '`') { startIndex++; } - return 0 == exactlyTableName.length() ? value : exactlyTableName.toString(); + exactlyTableName.append(value.charAt(startIndex)); + startIndex++; } - return value; + return 0 == exactlyTableName.length() ? value : exactlyTableName.toString(); } /** diff --git a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValue.java b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValue.java index 1fc968a366b..c546ed9f97b 100644 --- a/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValue.java +++ b/parser/sql/statement/core/src/main/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValue.java @@ -39,11 +39,12 @@ public final class IdentifierValue implements ValueASTNode<String> { private final QuoteCharacter quoteCharacter; public IdentifierValue(final String text) { - this(SQLUtils.getExactlyValue(text), QuoteCharacter.getQuoteCharacter(text)); - } - - public IdentifierValue(final String text, final String reservedCharacters) { - this(SQLUtils.getExactlyValue(text, reservedCharacters), QuoteCharacter.getQuoteCharacter(text)); + quoteCharacter = QuoteCharacter.getQuoteCharacter(text); + if (QuoteCharacter.BACK_QUOTE == quoteCharacter) { + value = SQLUtils.getRealContentInBackticks(text); + } else { + value = null == text ? null : quoteCharacter.unwrap(text); + } } /** diff --git a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValueTest.java b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValueTest.java index d0e30925c3e..3f162184e33 100644 --- a/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValueTest.java +++ b/parser/sql/statement/core/src/test/java/org/apache/shardingsphere/sql/parser/statement/core/value/identifier/IdentifierValueTest.java @@ -42,18 +42,6 @@ class IdentifierValueTest { assertThat(new IdentifierValue(text).getValue(), is("t_order")); } - @Test - void assertGetIdentifierValueWithBracket() { - String text = "ds_${[1,2]}.t_order"; - assertThat(new IdentifierValue(text).getValue(), is("ds_${1,2}.t_order")); - } - - @Test - void assertGetIdentifierValueWithReservedBracket() { - String text = "ds_${[1,2]}.t_order"; - assertThat(new IdentifierValue(text, "[]").getValue(), is("ds_${[1,2]}.t_order")); - } - @Test void assertGetValueWithQuoteCharactersWithNullValue() { assertThat(new IdentifierValue(null).getValueWithQuoteCharacters(), is(""));