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 e43c4aa2d76 Support extracting column name from function for
postgresql (#34147)
e43c4aa2d76 is described below
commit e43c4aa2d7653601698d7d866387a0e6bfcf1958
Author: ZhangCheng <[email protected]>
AuthorDate: Wed Dec 25 15:32:07 2024 +0800
Support extracting column name from function for postgresql (#34147)
* Support extracting column name from function for postgresql
* Support extracting column name from function for postgresql
* Support extracting column name from function for postgresql
* Support extracting column name from function for postgresql
* Support extracting column name from function for postgresql
---
.../extractor/DialectProjectionIdentifierExtractor.java | 8 +++++---
.../projection/extractor/ProjectionIdentifierExtractEngine.java | 8 +++++---
.../dialect/OpenGaussProjectionIdentifierExtractor.java | 9 +++++++--
.../extractor/dialect/OracleProjectionIdentifierExtractor.java | 5 +++--
.../dialect/PostgreSQLProjectionIdentifierExtractor.java | 9 +++++++--
.../segment/select/projection/impl/ExpressionProjection.java | 2 +-
.../infra/binder/engine/util/SubqueryTableBindUtils.java | 2 +-
.../extractor/ProjectionIdentifierExtractEngineTest.java | 3 ++-
.../dialect/OpenGaussProjectionIdentifierExtractorTest.java | 9 ++++++++-
.../dialect/OracleProjectionIdentifierExtractorTest.java | 3 ++-
.../dialect/PostgreSQLProjectionIdentifierExtractorTest.java | 9 ++++++++-
11 files changed, 49 insertions(+), 18 deletions(-)
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
index 23603c89028..3fb98209148 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/DialectProjectionIdentifierExtractor.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.infra.binder.context.segment.select.projection
import org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPI;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -46,12 +47,13 @@ public interface DialectProjectionIdentifierExtractor
extends DatabaseTypedSPI {
String getColumnNameFromFunction(String functionName, String
functionExpression);
/**
- * Get column name from expression.
+ * Get column name from expression segment.
*
- * @param expression expression
+ * @param expressionSegment expression segment
* @return column name
*/
- String getColumnNameFromExpression(String expression);
+
+ String getColumnNameFromExpression(ExpressionSegment expressionSegment);
/**
* Get column name from subquery segment.
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
index 5d69ad1c42e..6ba201598eb 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngine.java
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -61,11 +62,12 @@ public final class ProjectionIdentifierExtractEngine {
/**
* Get column name from expression.
*
- * @param expression expression
+ * @param expressionSegment expression segment
* @return column name
*/
- public String getColumnNameFromExpression(final String expression) {
- return
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class,
databaseType).map(optional ->
optional.getColumnNameFromExpression(expression)).orElse(expression);
+ public String getColumnNameFromExpression(final ExpressionSegment
expressionSegment) {
+ return
DatabaseTypedSPILoader.findService(DialectProjectionIdentifierExtractor.class,
databaseType).map(optional ->
optional.getColumnNameFromExpression(expressionSegment))
+ .orElse(expressionSegment.getText());
}
/**
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java
index c5ec97785cf..9471b600a5c 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractor.java
@@ -18,6 +18,9 @@
package
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -37,8 +40,10 @@ public final class OpenGaussProjectionIdentifierExtractor
implements DialectProj
}
@Override
- public String getColumnNameFromExpression(final String expression) {
- return "?column?";
+ public String getColumnNameFromExpression(final ExpressionSegment
expressionSegment) {
+ return expressionSegment instanceof ExpressionProjectionSegment &&
((ExpressionProjectionSegment) expressionSegment).getExpr() instanceof
FunctionSegment
+ ? ((FunctionSegment) ((ExpressionProjectionSegment)
expressionSegment).getExpr()).getFunctionName()
+ : "?column?";
}
@Override
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java
index 49195645c70..c519cc0da2a 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractor.java
@@ -18,6 +18,7 @@
package
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -37,8 +38,8 @@ public final class OracleProjectionIdentifierExtractor
implements DialectProject
}
@Override
- public String getColumnNameFromExpression(final String expression) {
- return expression.replace(" ", "").toUpperCase();
+ public String getColumnNameFromExpression(final ExpressionSegment
expressionSegment) {
+ return expressionSegment.getText().replace(" ", "").toUpperCase();
}
@Override
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java
index 720f7f0410b..fa641d5cc74 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractor.java
@@ -18,6 +18,9 @@
package
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.dialect;
import
org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.DialectProjectionIdentifierExtractor;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.ExpressionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
@@ -37,8 +40,10 @@ public final class PostgreSQLProjectionIdentifierExtractor
implements DialectPro
}
@Override
- public String getColumnNameFromExpression(final String expression) {
- return "?column?";
+ public String getColumnNameFromExpression(final ExpressionSegment
expressionSegment) {
+ return expressionSegment instanceof ExpressionProjectionSegment &&
((ExpressionProjectionSegment) expressionSegment).getExpr() instanceof
FunctionSegment
+ ? ((FunctionSegment) ((ExpressionProjectionSegment)
expressionSegment).getExpr()).getFunctionName()
+ : "?column?";
}
@Override
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java
index 76f93428dc1..3c1caf1c400 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/impl/ExpressionProjection.java
@@ -52,7 +52,7 @@ public final class ExpressionProjection implements Projection
{
@Override
public String getColumnLabel() {
ProjectionIdentifierExtractEngine extractEngine = new
ProjectionIdentifierExtractEngine(databaseType);
- return getAlias().map(extractEngine::getIdentifierValue).orElseGet(()
-> extractEngine.getColumnNameFromExpression(expressionSegment.getText()));
+ return getAlias().map(extractEngine::getIdentifierValue).orElseGet(()
-> extractEngine.getColumnNameFromExpression(expressionSegment));
}
@Override
diff --git
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
index 40d640b910b..cafaac7a910 100644
---
a/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
+++
b/infra/binder/src/main/java/org/apache/shardingsphere/infra/binder/engine/util/SubqueryTableBindUtils.java
@@ -100,6 +100,6 @@ public final class SubqueryTableBindUtils {
if (expressionSegment instanceof AliasAvailable && ((AliasAvailable)
expressionSegment).getAlias().isPresent()) {
return extractEngine.getIdentifierValue(((AliasAvailable)
expressionSegment).getAlias().get());
}
- return
extractEngine.getColumnNameFromExpression(expressionSegment.getText());
+ return extractEngine.getColumnNameFromExpression(expressionSegment);
}
}
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
index 6e51dd14c38..ce8e96a11d0 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/ProjectionIdentifierExtractEngineTest.java
@@ -21,6 +21,7 @@ import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.Quo
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
@@ -50,7 +51,7 @@ class ProjectionIdentifierExtractEngineTest {
@Test
void assertGetColumnNameFromExpression() {
- assertThat(new
ProjectionIdentifierExtractEngine(databaseType).getColumnNameFromExpression("expression"),
is("expression"));
+ assertThat(new
ProjectionIdentifierExtractEngine(databaseType).getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "expression")), is("expression"));
}
@Test
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java
index e898c4c23c4..8afc81ef87d 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OpenGaussProjectionIdentifierExtractorTest.java
@@ -22,7 +22,9 @@ import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.Quo
import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
@@ -49,7 +51,12 @@ class OpenGaussProjectionIdentifierExtractorTest {
@Test
void assertGetColumnNameFromExpression() {
- assertThat(extractor.getColumnNameFromExpression("expression"),
is("?column?"));
+ assertThat(extractor.getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "expression")), is("?column?"));
+ }
+
+ @Test
+ void assertGetColumnNameFromFunctionExpression() {
+ assertThat(extractor.getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "SUM(ID)", new FunctionSegment(0, 0, "SUM",
"SUM(ID)"))), is("SUM"));
}
@Test
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java
index 563b1eca8d3..17ed34e40e0 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/OracleProjectionIdentifierExtractorTest.java
@@ -23,6 +23,7 @@ import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
@@ -49,7 +50,7 @@ class OracleProjectionIdentifierExtractorTest {
@Test
void assertGetColumnNameFromExpression() {
- assertThat(extractor.getColumnNameFromExpression("expression"),
is("EXPRESSION"));
+ assertThat(extractor.getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "expression")), is("EXPRESSION"));
}
@Test
diff --git
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java
index 42f3afbb3bc..1bdfcd2b863 100644
---
a/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java
+++
b/infra/binder/src/test/java/org/apache/shardingsphere/infra/binder/context/segment/select/projection/extractor/dialect/PostgreSQLProjectionIdentifierExtractorTest.java
@@ -22,7 +22,9 @@ import
org.apache.shardingsphere.infra.database.core.metadata.database.enums.Quo
import
org.apache.shardingsphere.infra.database.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.FunctionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.expr.subquery.SubquerySegment;
+import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.ExpressionProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.SubqueryProjectionSegment;
import
org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
import org.junit.jupiter.api.Test;
@@ -49,7 +51,12 @@ class PostgreSQLProjectionIdentifierExtractorTest {
@Test
void assertGetColumnNameFromExpression() {
- assertThat(extractor.getColumnNameFromExpression("expression"),
is("?column?"));
+ assertThat(extractor.getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "expression")), is("?column?"));
+ }
+
+ @Test
+ void assertGetColumnNameFromFunctionExpression() {
+ assertThat(extractor.getColumnNameFromExpression(new
ExpressionProjectionSegment(0, 0, "SUM(ID)", new FunctionSegment(0, 0, "SUM",
"SUM(ID)"))), is("SUM"));
}
@Test