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

Reply via email to